今天我偶然發現了一些奇怪的內部(非靜態)類行爲。如果內部類擴展外部類,內部類的不同成員行爲?
如果我有以下類...
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