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);
            }
        }
    }
}

为什么会这样呢

  1. 编译器在编译的时候会把你的构造方法改造成这样
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