匿名类变量

Rub*_*iks 10 java

我今天正在尝试匿名课程.当我这样做时System.out.println(super.x);,它打印12,当我使用System.out.println(x);它打印4.我认为super.x会打印4,并想知道是否有人可以请你解释为什么这是?

public class AnonClass {

    private int x = 1;

    public AnonClass(int x) {
        this.x = x;
    }

    public static void main(String[] args) {
        AnonClass test = new AnonClass(4);
        test.testMethod();
    }

    public void testMethod() {

        AnonClass anon = new AnonClass(12) {
            {
                System.out.println(super.x); //Prints 12
                System.out.println(x); //prints 4
            }
        };

    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 11

当你在里面定义一个这样的匿名类时class AnonClass:

AnonClass anon =
    new AnonClass(12) {
      {
        System.out.println(super.x); //Prints 12
        System.out.println(x); //prints 4
      }
    };
Run Code Online (Sandbox Code Playgroud)

编译器将创建一个这样的类:

class AnonClass$1 extends AnonClass {
  final AnonClass enclosed;

  AnonClass$1(AnonClass enclosed, int x) {
    super(x);
    System.out.println(super.x);
    System.out.println(enclosed.x);
    this.enclosed = enclosed;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后调用它:

AnonClass anon = new AnonClass$1(this, 12);
Run Code Online (Sandbox Code Playgroud)

请注意,superconstructor(super(x);)的调用发生在实例初始化程序(System.out.println行)的内容之前.

因此,AnonClass.x超级构造器将字段初始化为12,然后将其值打印为12via System.out.println(super.x);.

然后,System.out.println(x)实际上引用了x封闭实例中AnonClass的值,其值为4.

它不打印的原因12又是xprivate; 正如它在JLS Sec 8.2中所述:

声明为private的类的成员不会被该类的子类继承.

所以没有AnonClass$1.x打印; 调用范围中唯一的标识符xAnonClass.x.

  • 这是一个回答我的问题的提示,我猜:如果你从字段`x`中删除`private`,那么`super.x`和`x`都指的是超级实例.只有当`x`是'private`时,不合格的`x`才会引用封闭的实例. (2认同)