首先,您的stringOuter 和stringInner 是字段,而不是方法。因此,您不能“调用”它们,并且您的 i.stringInner; 示例仍然无法编译,因为它不是语句。
为了使示例有效,我们可以将字段的值分配给另一个变量。
public class OuterClass {
String stringOuter;
void m1() {
InnerClass i = new InnerClass();
String s = i.stringInner;
}
class InnerClass {
String stringInner;
void m2() {
String s = stringOuter;
}
}
}
void m2() { String s = stringOuter; } 起作用的原因在于,与具有 static 修饰符的嵌套类相比,内部类始终具有外部类的关联实例。
您的示例方法m2() 等效于
void m2() {
OuterClass o = OuterClass.this;
String s = o.stringOuter;
}
在您的示例中,对外部类实例的引用的初始化是隐式的,它仅适用于 OuterClass 的实例在范围内的上下文。所以当你把m1()方法改成
static void m1() {
InnerClass i = new InnerClass(); // compiler error
String s = i.stringInner;
}
它不再起作用了,因为没有 OuterClass 的实例。您可以提供一个显式实例:
static void m1() {
OuterClass outer = new OuterClass();
InnerClass i = outer.new InnerClass(); // uses outer
String s = i.stringInner;
}
但这是 Java 编程语言中很少使用的特性。
如前所述,如果将内部类更改为嵌套类,则可以在没有外部类实例的情况下对其进行实例化,但如果不显式指定实例,也无法访问非静态成员:
public class OuterClass {
String stringOuter;
static void m1() {
InnerClass i = new InnerClass(); // no problem
String s = i.stringInner;
}
static class InnerClass {
String stringInner;
void m2() {
String s1 = new OuterClass().stringOuter; // works
String s = stringOuter; // does not work
}
}
}