Lambda表达式与匿名内部类的联系和区别

来源:互联网 发布:c语言有趣小程序 编辑:程序博客网 时间:2024/06/06 03:08

联系:

lambda表达式创建的对象与匿名内部类生成的对象一样,可以直接调用接口中继承的默认方法。

区别:

1.匿名内部类可以为任意接口创建实例,不管接口中包含多少个抽象方法,只要在匿名内部类中实现所有抽象方法即可。

   但在lambda表达式中只能为函数式接口创建实例。

2.匿名内部类可以为抽象类甚至普通类创建实例;但lambda表达式只能为函数式接口创建实例。

3.匿名内部类实现的抽象方法可以允许调用接口中定义默认方法。但lambda表达式的代码块不允许调用接口中定义默认方法。


package learnJava;public class NimingLei {public void test(Product p) {System.out.println(p.getName()+" : "+p.getPrice());}public void test2(Device q){System.out.println(q.getPrice());System.out.println(q.getName());}public static void main(String[] args) {NimingLei ta=new NimingLei();ta.test(new Product() {public double getPrice() {return 100;}public String getName() {return "新产品";}});ta.test2(new Device("示波器") {{System.out.println("匿名内部类的初始化块");//可以写初始化块}public double getPrice() {//必须实现抽象方法return 562.2;}public String getName() {//可以重写父类的普通方法return "新键盘";}});}}interface Product{public double getPrice();public String getName();}abstract class Device{//既可以是抽象类也可以为普通类private String name;public abstract double getPrice();public String getName() {return "鼠标";}public Device() {}public Device(String name) {this.name=name;}}//匿名内部类即可以为抽象类也可以为普通类创建实例。


package learnJava;public class Lambda1 {public void eat(Eatable e) {System.out.println(e);e.taste();}public void drive(Flyable f) {System.out.println(f);f.fly("晴朗");//调用接口中的方法}public void test(Addable g) {System.out.println(g);g.Add(10, 20);}public static void main(String[] args) {Lambda1 ew=new Lambda1();ew.eat(()->System.out.println("真不错"));//形参列表为空//()->System.out.println("真不错")相当于一个Eatable对象,实现了一个接口的方法ew.drive(weather->System.out.println("今天的天气: "+weather));//创建一个接口对象,并实现接口里的抽象方法,形参列表要与接口中的抽象方法相同。ew.test((a,b)->{System.out.println("a的值是:"+a+" b的值是:"+b);System.out.println(a+b);});}}interface Eatable{void taste();}interface Flyable{void fly(String weather);}interface Addable{void Add(int a,int b);}


原创粉丝点击