七 Lambda表达式和匿名内部类的相同点和区别


/**
* 七 Lambda表达式和匿名内部类的相同点和区别
* 相同点
* 1 两者内部一样可以访问成员变量,局部变量,且访问局部变量后就会变成final变量
* 2 两者对象都可以调用来自接口的默认方法
* 区别
* 1 匿名内部类可以为任何类(包括抽象类),接口创建对象,而Lambda表达式只能为函数式接口的创建对象,但都必须实现所有的抽象方法
* 2 匿名内部类,终究是一个类,不用把它特殊化,他和普通类实现接口完全一致,所有类,接口继承的特点就是继承一切,除了构造器和代码块),
* 而Lambda与接口的实例,无法访问该类的一切成员,包括default方法
*
*/
//七 Lambda表达式和匿名内部类的相同点和区别
public class LambdaTest1 {
public static void main(String[] args) throws Exception {
// i = 1111;访问局部变量后就会变成final变量,修改报错
//创建Shape匿名内部类对象
var anonymous = new Shape(){
@Override
public void a() {
int i = 2;
System.out.println("匿名内部类实现了抽象方法");
}
//通过自定义的方法,访问了如下内容
public void def() throws Exception{
System.out.println(name);//访问继承的name
a();//访问实现了的抽象方法
b();//访问继承的默认方法
//c();c()也确实被继承了,虽然是静态方法,无法访问,容易造成混乱,官方建议通过类.方法
System.out.println("=>" + new InnerInterface(){});//创建继承的内部接口对象
System.out.println("=>" + new InnerClass(){});//创建继承的内部内部类对象
System.out.println("=>" + Reason.SPRING);//访问创建继承的内部枚举实例
}
};
//通过Lambda表达式创建Shape对象
int ii = 1;
Shape lambda = ()->{
// ii = 1111;访问局部变量后就会变成final变量,修改报错
System.out.println("Lambda表达式实现的抽象方法");
/* 以下全部报错如下证明Lambda不可以访问default方法,无法直接访问接口的一切成员
System.out.println(name);//无法访问静态变量name
b();访问默认方法报错
c();访问静态方法也报错
System.out.println("=>" + new InnerInterface(){});//创建继承的内部接口对象
System.out.println("=>" + Reason.SPRING);//访问创建继承的内部枚举实例,报错
System.out.println("=>" + new InnerClass(){});//创建继承的内部内部类对象
*/
};
anonymous.def();
System.out.println("------------------分界线-------------------");
lambda.a();

}
}
interface Shape{
String name = "tom";
void a();
default void b() {
System.out.println("默认方法");
}
static void c() {
System.out.println("静态方法");
}
private static void d(){
System.out.println("静态私有方法");
}
private void e(){
System.out.println("实例私有方法");
}
interface InnerInterface{}
enum Reason{SPRING,SUMMER,AUTUMN,WINTER}
class InnerClass{
private static void d(){}
private static void e(){}

public static void aa() {
c();
System.out.println("B类实现了A接口的a()抽象方法");
}
}
}
posted @ 2022-05-15 21:10  -和时间赛跑-  阅读(55)  评论(0编辑  收藏  举报