非静态内部类中需用outerclass.this访问外部类实例。当内外类同名、需传外部实例、调用外部方法或对象判等时必须使用;仅限非静态内部类,编译后对应隐式final字段this$0。

在非静态内部类中,直接写 this 指向的是内部类自身实例,无法访问外部类的成员(尤其是同名变量或方法时)。要明确拿到外部类的当前对象,必须用 外部类名.this 的写法。
什么时候必须用 OuterClass.this
当内部类中存在与外部类同名的字段、方法,或需要显式传入外部类实例时,this 已被内部类占用,只能靠带类名的限定形式来区分:
- 访问被遮蔽的外部类私有字段(比如内外都有
name) - 将外部类实例作为参数传递给其他方法
- 在匿名或局部内部类中调用外部类的实例方法
- 做对象判等(例如
if (obj == Outer.this))
语法和使用要点
OuterClass.this 是一个合法表达式,类型就是 OuterClass,不是关键字也不是语法糖:
- 只能用于非静态内部类(含成员内部类、局部内部类、匿名内部类)
- 静态内部类不持有外部类引用,不能使用该写法
- 不可写成
OuterClass().this或this.OuterClass,编译报错 - 可在构造器、普通方法、甚至 lambda(若上下文是内部类)中使用
实际代码示例
以下是一个清晰可运行的片段:
class Outer {
private String data = "from outer";
class Inner {
private String data = "from inner";
void show() {
System.out.println(this.data); // 输出:from inner
System.out.println(Outer.this.data); // 输出:from outer
}
void useInMethod() {
process(Outer.this); // 把外部类实例传出去
}
}
void process(Outer o) {
System.out.println("Got: " + o.data);
}
}
底层其实是个隐式字段
编译后,JVM 会为每个非静态内部类自动添加一个 final Outer this$0 字段,并在构造时由编译器注入外部类引用。所以 Outer.this 实质上就是读取这个隐藏字段,完全安全可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











