困扰我的是第二点。
我认为这可能与“this”指针不是静态的事实有关,因此内部类无法访问它。我不确定这是否是正确的解释。
这也为我提出了另一个问题,即“这个”指针定义在哪里?“
答案 0 :(得分:11)
static
嵌套类和非static
之间的区别恰恰是非static
内部类的实例与封闭的特定实例相关联class,而static
内部类不是。对于要与之关联的A.this
内部类的实例, 没有static
。
答案 1 :(得分:2)
如果内部类是static
,则可以在没有外部类的封闭实例的情况下对其进行实例化。对于非static
内部类,实例化需要外部类的实例。例如,如果您的类结构是这样的:
public class A {
public static class B {
}
public class C {
}
}
然后要实例化B
和C
,你必须这样做:
// simply
A.B b = new A.B();
// however
A.C c = new A().new C();
在实例化非static
内部类的后台,将封闭类的实例传递给构造函数。然后可以访问OuterClass.this
的实例。
要验证“幕后”的事情,你可以通过反射检查声明的构造函数和内部类的声明字段:
// prints that there is one field of type A called "this$1"
for (Field f : A.C.class.getDeclaredFields()) {
System.out.println(f);
}
// prints that the constructor takes in one parameter of type A
for (Constructor c : A.C.class.getDeclaredConstructors()) {
System.out.println(c);
}