【发布时间】:2016-04-08 04:27:36
【问题描述】:
今天我偶然发现了一些奇怪的内部(非静态)类行为。
如果我有以下课程...
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!
如果我查看构造函数,我还发现如果创建了 InheritdB 的实例,则会创建一个新的 B 实例。
我觉得这很奇怪......有人可以解释为什么会有这种差异吗?
【问题讨论】:
-
你确定你说的不是
InheritedB extends InnerB? -
为了我的安心,请告诉我您不打算在实际代码中执行此操作,您只是想看看发生了什么。
标签: java inheritance inner-classes