Lambda表达式-匿名内部类的区别-002

2019-01-03  本文已影响0人  小尾巴1024

Lambda表达式和匿名内部类在JVM中处理的方式是不一样的

匿名内部类实现

匿名内部类仍然是一个类,只是不需要程序员显示指定类名,编译器会自动为该类取名。

//下面这个java文件被编译后,jvm会生成2个class文件,一个是主类,另一个是匿名类
public class MyDemo {
    public static void main(String[] args) {
        new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("Thread run()....");
            }
        }).start();
    }
}
生成两个class

Lambda表达式实现

Lambda表达式通过invokedynamic指令实现,书写Lambda表达式不会产生新的类。如果有如下代码,编译之后只有一个class文件:

public class LambdaDemo {
    public static void main(String[] args) {
        new Thread(
                () -> System.out.println("Lambda Thread run()...")
        ).start();
    }
}
只生成一个class

那么,在lambda表达式内使用this有何意义呢?

在lambda表达中引用this关键字,和在lambda外部引用的意义一样,因为lambda不是内部类的代表,那么在lambda内部引用this也就和内部类没什么关系了。

//下面的代码将输出再次Hello...
public class LambdaDemo {
    Runnable r1 = () -> { System.out.println(this); };
    Runnable r2 = () -> { System.out.println(toString()); };
    public static void main(String[] args) {
        new LambdaDemo().r1.run();
        new LambdaDemo().r2.run();
    }

    public String toString() {
        return "Hello...";
    }
}

参考:http://www.cnblogs.com/CarpenterLee/p/6729368.html

上一篇 下一篇

猜你喜欢

热点阅读