为何Java Lambda表达式可通过this访问父类成员而匿名类不行?
Lambda与匿名类中this指向的差异解析
先看你给出的代码:
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也应指向该匿名类,可它却能访问到name,这是为什么?
核心原因
两者的本质差异在于是否创建独立的作用域和类实例:
- 匿名类:
new Runnable() {...}是实实在在创建了一个Runnable接口的匿名实现类对象,这个对象有自己独立的作用域,代码里的this指向的就是这个匿名类的实例。而这个匿名类内部并没有定义name变量,直接用this.name自然找不到对应属性(如果要访问外部类的静态变量,得写ThreadTest.name才行)。 - Lambda表达式:它并不是一个独立的类实例,更像是嵌入在外部方法里的一段代码逻辑,不会创建新的作用域。Lambda里的
this和定义它的外部上下文(也就是ThreadTest的run方法所属的实例)是同一个,所以能直接访问this.name(这里的name是静态变量,其实用ThreadTest.name也能访问,但Lambda的this指向外部类实例是关键)。
简单总结:Lambda的this和外部类的this完全一致,而匿名类的this只指向它自己的实例。
内容的提问来源于stack exchange,提问作者Grateful
相关产品推荐
相关产品推荐

