今天我偶然发现了一些奇怪的内部(非静态)类行为。如果内部类扩展外部类,内部类的不同成员行为?
如果我有以下类...
class B {
String val = "old";
void run(){
val = "new";
System.out.println(val); // outputs: new
new InnerB().printVal(); // outputs: new
}
private class InnerB {
void printVal(){ System.out.println(val); }
}
}
new B().run();
...一切似乎是明确的。 InnerB的实例属于B的实例,所以如果它应该输出val,它会打印已经替换的值'new'。
但如果内部类扩展外部类,这是行不通的。
class B {
String val = "old";
void run(){
val = "new";
System.out.println(val); // outputs: new
new InnerB().printVal(); // outputs: new
new InheritedB().printVal(); // outputs: old new
}
private class InnerB {
void printVal(){ System.out.println(val); }
}
private class InheritedB extends B{
void printVal(){ System.out.println(val + " "+ B.this.val); }
}
}
new B().run(); // outputs: new new old!
如果我有一个看看构造我也看到,如果创建InheritedB实例B的新实例将被创建。
我觉得这很奇怪......有人可以解释为什么有这种差异?
你确定你不是指'InheritedB extends InnerB'吗? – user3707125
为了让我安心,请告诉我你不打算在真正的代码中这样做,你只是在乱搞,看看发生了什么。 – jpmc26