java编译器
java编译器
语法糖
类名.this(获取外部调用类实例)
用于获取外部对象的this实例
对于下面这段代码,编译器会做优化
public class OuterClass { // 最外层类
private String outerField = "Outer Field";
public class InnerClass { // 第一层内部类
private String innerField = "Inner Field";
public class InnerInnerClass { // 第二层内部类(最内层)
public void printAllFields() {
// 访问本实例的字段
System.out.println("本内部类字段: (需要自行定义)");
// 访问直接外部类(InnerClass)的实例
System.out.println("直接外部类字段: " + InnerClass.this.innerField);
// 访问最外层类(OuterClass)的实例
System.out.println("最外层类字段: " + OuterClass.this.outerField);
}
}
}
}
编译器会优化成下面这样
public class OuterClass { // 最外层类
private String outerField = "Outer Field";
public class InnerClass { // 第一层内部类
private String innerField = "Inner Field";
public class InnerInnerClass { // 第二层内部类(最内层)
public void printAllFields() {
// 访问本实例的字段
System.out.println("本内部类字段: (需要自行定义)");
// 访问直接外部类(InnerClass)的实例
System.out.println("直接外部类字段: " + this.this$0.innerField);
// 访问最外层类(OuterClass)的实例
System.out.println("最外层类字段: " + this.this$0.this$0.outerField);
}
}
}
}
为什么会这样呢
- 编译器在编译的时候会把你的构造方法改造成这样
class a{
//原始无参构造方法
public a(){}
//改造成下面这样
public a(OutterClass OutterClassInstace){
//维护一个隐藏的this$0属性来持有外部调用对象的引用
//当你通过 外部类名.this的时候就会优化为 this.this$
this.this$0=OutterClassInstace;
}
}
更新: 2025-11-25 22:33:20
原文: https://www.yuque.com/duifangzhengzaishuru-rqbua/axyc58/vbe9150srz3tq4go