我今天正在尝试匿名课程.当我这样做时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又是x是private; 正如它在JLS Sec 8.2中所述:
声明为private的类的成员不会被该类的子类继承.
所以没有AnonClass$1.x打印; 调用范围中唯一的标识符x是AnonClass.x.