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 }
