You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:44:57