内部类
- 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类.
- 场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类.
内部类有四种形式
- 成员内部类:类中的一个普通成员,类似于普通的成员变量,成员方法
djk16开始支持定义静态成员
创建成员内部类对象要先创建外部类对象:外部类命.内部类名 对象名 = new 外部类名().new 内部类名();
内部类调用外部类的变量通过:外部类名.this.变量名
- 静态内部类:有static修饰的内部类,属于外部类自己持有
创建静态内部类对象:外部类命.内部类名 对象名 = new 外部类名.内部类名
可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员.
- 局部内部类:定义在方法中,代码块中,构造器等执行体中
匿名内部类:
一种特殊的局部内部类;所谓匿名指的是程序员不需要为这个类声明名字
格式:
new 类或接口(参数值...){ 类体(一般是方法重写); };
**特点:**匿名内部类本质就是一个子类,并会立即创建出一个子类对象
**作用:**用于更方便的创建一个子类对象
匿名内部类在开发中的使用场景:
通常作为一个参数传输给方法
更方便的创建出一个子类对象
- 匿名内部类:看接口的抽象方法个数(1~2个)
- 单独编写实现类:接口中抽象方法个数很多
Lambda表达式
- Lambda表达式是DJK8开始后的一种新语法形式(只能操作函数式接口)
- 作用:简化匿名内部类的代码写法
Lambad表达式只能简化函数式接口的匿名内部类的写法形式
函数式接口:有且仅有一个抽象方法的接口,可以使@FunctionalInterface 注解, 来检查是否是函数式接口
Lambad表达式的简化格式
() -> {}
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码
}
注:-> 是语法形式,无实际意义
Lambda表达式的省略写法
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时 () 也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码可以省略大括号不写,同时要省略分号此时,如果这行代码是return语句,必须省略return不写,同时也必须省略 “;” 不写
Lambda表达式和匿名内部类的区别
使用限制不同
- 匿名内部类 : 可以操作类, 接口
- Lambda表达式 : 只能操作函数式接口
实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件