1 package day13.lesson1.p3; 2 3 /* 4 1.8 Lambda表达式和匿名内部类的区别 5 6 所需类型不同 7 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 8 Lambda表达式:只能是接口 9 10 使用限制不同 11 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 12 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式 13 14 实现原理不同 15 匿名内部类:编译之后,产生一个单独的.class字节码文件 16 Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成 17 */ 18 public class LambdaDemo { 19 public static void main(String[] args) { 20 //匿名内部类 21 useInter(new Inter() { 22 @Override 23 public void show() { 24 System.out.println("接口"); 25 } 26 }); 27 28 useAnimal(new Animal() { 29 @Override 30 public void method() { 31 System.out.println("抽象类"); 32 } 33 }); 34 35 useStudent(new Student(){ 36 @Override 37 public void study() { 38 // super.study(); 39 System.out.println("具体类"); 40 } 41 }); 42 43 //Lambda 44 useInter(() -> System.out.println("接口")); 45 // useAnimal(() -> System.out.println("抽象类")); //编译异常 46 // useStudent(() -> System.out.println("具体类")); //编译异常 47 48 /*useInter(new Inter() { 49 @Override 50 public void show() { 51 System.out.println("show"); 52 } 53 54 @Override 55 public void show2() { 56 System.out.println("show2"); 57 } 58 });*/ 59 } 60 61 private static void useInter(Inter i){ 62 i.show(); 63 } 64 65 private static void useAnimal(Animal a){ 66 a.method(); 67 } 68 69 private static void useStudent(Student s){ 70 s.study(); 71 } 72 } 73 74 interface Inter{ 75 void show(); 76 // void show2(); 77 } 78 79 abstract class Animal{ 80 public abstract void method(); 81 } 82 83 class Student{ 84 public void study(){ 85 System.out.println("love life, love java"); 86 } 87 }