1.什么是内部类
内部类是在一个类里面又定义了一个类
例如
public class People{
//内部类
public class Heart{
}
}
使用场景:
- 当一个事物的内部,还有一部分需要一个完整的结构进行描述,而这个内部的完整的结构又为外部事物提供服务,那么整个内部完整结构可以选择内部类来设计
- 内部类通常可以访问外部类的成员,包括私有成员
- 内部类提供了更好的封装性,内部类本身就可以用private protected等来修饰,封装性可以做到很多控制
2.那么什么是匿名内部类呢?
本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
作用:方便创建子类对象,最终目的为了简化代码编写
格式:
new 类|抽象类名|接口名(){
重写方法
};
例子:
public class Test {
public static void main(String[] args) {
Animal a = new Animal() {
@Override
public void run() {
System.out.println("老虎跑的快");
}
};
a.run();
}
}
//class Tiger extends Animal{
// @Override
// public void run() {
// System.out.println("老虎跑的块");
//
// }
//}
abstract class Animal{
public abstract void run();
}
特点:
- 没有名字
- 写出来就会产生一个匿名内部类
- 其对象类型相当于是当前new的那个的类的子类型
3.Lambda表达式
Lambda表达式是用于简化匿名内部类的代码写法。
格式:
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码。}
// 注:-> 是语法形式,无实际含义
注意:Lambda表达式只能简化函数式 接口 的匿名内部类的写法形式
那么什么是函数式接口呢?
- 首先它得是一个接口吧,然后接口中有且仅有一个抽象方法的形式
- 通常我们回在接口上加一个@Functionallnterface注解,标记该接口必须是满足函数式接口。
例子:
public class LambdaDemo1 {
public static void main(String[] args) {
//原有的写法
Animal a = new Animal() {
@Override
public void run() {
System.out.println("乌龟跑的很慢");
}
};
a.run();
//Lambda写法
Animal a1 = () -> { System.out.println("乌龟跑的很慢"); };
a.run();
}
}
//定义一个函数式接口
@FunctionalInterface
interface Animal{
void run();
}
简化规则:
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return公语句,必须省略return不写,同时也必须省略”."不写
好了,只是简单的介绍语法,具体的还是要到开发时候使用。