在以下课程中:
public class ThreadTest {
public static String name = "Member Accessed";
public void run() {
// Anonymous class
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Using Anonymous class, referencing this.name " + this.name);
}
};
// lambda expression
Runnable r2 = () -> {
System.out.println("Using Lambda Expression, referencing this.name " + this.name);
};
new Thread(r1).start();
new Thread(r2).start();
}
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();
tt.run();
}
}
为什么lambda表达式可以访问
this.name
,而匿名类不能?我知道对于匿名类, this
引用匿名类范围,并且 name
在那里不存在。但是,lambda 表达式基本上是属于实现接口的匿名类的匿名方法。因此,从技术上讲,this
还应该为 lambda 表达式引用匿名类。但不知何故,this
设法引用了 name
.
为什么会这样?
首先,只要您引用实例而不是类变量,就解决这个问题:
public String name = "Member Accessed";
虽然每个 lambda 表达式都可以表示为一个匿名类,但它们的字节码不同,正如 Eliott Frisch said。我的知识不够丰富,无法提供更多细节,但我可以向您推荐 Brian Goetz 的一篇非常有趣的读物。可悲的是,只要原始链接不再处于活动状态,就只能通过此答案访问脚本:Lambda Translation Strategy.
反正匿名类可以通过使用
this
指定类名来指出外部类的实例变量。
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Using Anonymous class: " + ThreadTest.this.name);
}
};