如果内部类扩展外部类,则内部类的不同成员行为?
2022-09-01 20:24:01
今天,我偶然发现了一些奇怪的内部(非静态)阶级行为。
如果我有以下课程...
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 实例。
我觉得这很奇怪...有人能解释为什么会有这种差异吗?