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...";
}
}
网友评论