Lambda表达式和匿名内部类的相同点:
- 都可以直接访问成员变量,effectively final变量
- Lambda表达式返回的对象和匿名内部类创建的对象一样,可以调用继承自接口的default方法。
Lambda表达式和匿名内部类的不同点:
- Lambda表达式只能为函数式接口创建对象,函数式接口只有一个抽象方法,而匿名内部类可以为普通类或任意接口创建对象,接口可以包含多个抽奖方法。
- Lambda表达式的代码块内不能调用继承自接口的default方法,而匿名内部类实现的抽象方法的方法体内可以调用接口的default方法。
1 public class LambdaTest { 2 3 public static void main(String[] args) { 4 //下面是effectively final 变量 5 int a=10; 6 count c1 = new count(){ 7 @Override 8 public void printer() { 9 //访问effectively final 变量 10 System.out.println("匿名内部类 访问了effectively final 变量"+a); 11 //实现的抽象方法内调用接口default方法:add() 12 System.out.println(add(1,2)); 13 } 14 }; 15 c1.printer(); 16 17 count c2=()->System.out.println("Lambda表达式 访问了 effectively final 变量"+a); 18 c2.printer(); 19 //只能通过Lambda表达式对象调用接口的default方法 20 int sum = c2.add(1, 2); 21 System.out.println(sum); 22 } 23 } 24 25 interface count{ 26 void printer(); 27 default int add(int a,int b){ 28 return a+b; 29 } 30 }