1. 内部类

一个类中内部中定义了一个类B

如:

  1. public class A{
  2. public class b{
  3. }
  4. }

内部类的访问特点

  1. 内部类可以直接访问外部类的成员,包括私有
  2. 外部了你要访问内部类成员,必须创建对象

2. 成员内部类

如是公共则可以创建对象

  1. a类名.b类名 i=new a类名().new b类名();

3. 局部内部类

局部类外界是无法直接访问的

需要在内部创建对象并使用

4. 匿名内部类

匿名内部类 是一贯继承了该类或者实现了该接口的子类匿名对象

  1. new 类名或接口名(){
  2. 重写方法;
  3. };

匿名内部类可以直接调用方法 只需要在匿名内部类后调用

  1. new Inter(){
  2. @Override
  3. public void show() {
  4. System.out.println("匿名内部类");
  5. }
  6. }.show(); //匿名内部类需要在匿名内部类后直接调用内部类的方法

匿名内部类本质上也是一个类 但是是匿名无法 直接调用

但我们可以通过多态实现创建对象 来调用

  1. Inter i = new Inter(){ //匿名内部类也可以使用多态创建对象
  2. @Override
  3. public void show() {
  4. System.out.println("匿名内部类");
  5. }
  6. }; //匿名内部类需要在匿名内部类后直接调用内部类的方法
  7. i.show(); //调用方法

如果一个方法需要提供一个接口并使用它,我们可以在方法中直接new一个匿名内部类并重写接口的方法

  1. public void in(Inter inter){
  2. inter.show();
  3. }
  4. Outer op =new Outer();
  5. op.in(new Inter() {
  6. @Override
  7. public void show() {
  8. System.out.println("在方法中直接new一个匿名内部类");
  9. }
  10. });

5. lambda表达式

lambda表达式,我们上面使用直接new一个匿名内部类给这个方法,我们也可以通过lambda表达式直接传一个

使用lambda表达式的前提

  1. 有一个接口
  2. 接口中有且仅有一个抽象方法

语法: (参数) -> {重写方法};

  1. public class lambda {
  2. public static void main(String[] args) {
  3. goswimming(() -> {
  4. System.out.println("lambda");
  5. });
  6. }
  7. public static void goswimming(Swimming swimming){
  8. swimming.swim();
  9. }
  10. }
  11. interface Swimming { // 要求必须为接口实现
  12. void swim(); // 只能有一个抽象方法
  13. }

带参无返回值

  1. public class lambda2 {
  2. public static void main(String[] args) {
  3. useStringHandler(new StringHandler() {
  4. @Override
  5. public void pringMessage(String msg) {
  6. System.out.println("new匿名内部类 " + msg);
  7. }
  8. });
  9. useStringHandler((String msg) -> {
  10. System.out.println("lambda传参 " + msg);
  11. });
  12. }
  13. public static void useStringHandler(StringHandler stringHandler) {
  14. stringHandler.pringMessage("默认值");
  15. }
  16. }
  17. interface StringHandler {
  18. void pringMessage(String msg);
  19. }

带返回值的lambda表达式

必须return

  1. import java.util.Random;
  2. public class lambda3 {
  3. public static void main(String[] args) {
  4. useRandomNumHandler(() -> {
  5. Random r =new Random();
  6. int num = r.nextInt(10)+1;
  7. return num;
  8. });
  9. }
  10. public static void useRandomNumHandler(RandomNumHandler randomNumHandler){
  11. int result = randomNumHandler.getNumber();
  12. System.out.println(result);
  13. }
  14. }
  15. interface RandomNumHandler{
  16. int getNumber();
  17. }

带参与带返回值

  1. public class lambda4 {
  2. public static void main(String[] args) {
  3. useCalculator(( a , b) -> a+b);
  4. }
  5. public static void useCalculator(Calculator calculator){
  6. int result = calculator.calc(10,20);
  7. System.out.println(result);
  8. }
  9. }
  10. interface Calculator{
  11. int calc(int a,int b);
  12. }

5.1. lambda表达式的省略

  • 参数类型可以省略,但有多个不同的参数类型时不能省略

  • 如果参数只有一个,则小括号可以省略,没有参数则不能省略必须书写()

  • 如果代码块的语句只有一条,可以省略大括号和分号甚至是return语句

  • m m,kkhj ;bnhjuo9p[‘inmji0op];[

  • khJU <KINM]’编译之后会生成一个单独的.class文件

  • lambda表达式:编译之后,不会生成.class文件,对应的字节码会在运行时动态生成