匿名内部类与Lambda表达式的区别:
1、所需类型不同。匿名内部类:可以是接口、抽象类、具体类。Lambda表达式:只能是接口
2、使用限制不同。如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类。 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
3、实现原理不同。匿名内部类虽然跟使用Lambda效果一样,但是会自动多生成一个.class字节码文件,只是我们在写的时候没有发觉,这也是匿名内部类跟Lambda的区别,Lambda的字节码文件会动态生成,我们看不见,这个知道即可,在具体编程中感受不到,对于初学者或一般开发作业中不必过多关注。
具体示例代码:
接口:Inter
public interface Inter {
void show();
}
抽象类:People
public abstract class People {
abstract void method();
}
具体类:Employee
public class Employee {
void work(){
System.out.println("雇员要工作");
}
}
测试类:LambdaTest
public class LamdbaTest {
public static void main(String[] args) {
useInter(new Inter() {
@Override
public void show() {
System.out.println("接口Inter");
}
});
usePeople(new People() {
@Override
void method() {
System.out.println("抽象类People");
}
});
useEmployee(new Employee(){
@Override
void work() {
// super.work();
System.out.println("具体类Employee");
}
});
System.out.println("================");
//用 Lambda表达式
useInter(()-> System.out.println("接口Inter"));
/*以下两种方式就不可以
usePeople(() -> System.out.println("抽象类People"));
useEmployee(() -> System.out.println("具体类Employee"));
*/
}
private static void useInter(Inter i) {
i.show();
}
private static void usePeople(People p) {
p.method();
}
private static void useEmployee(Employee e) {
e.work();
}
}
运行结果: