Сегодня я наткнулся на какое-то странное внутреннее (нестатическое) поведение класса.
Если у меня есть следующие классы...
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!
Если я посмотрю на конструкторы, я также вижу, что новый экземпляр B будет создан, если создан экземпляр InheritedB.
Я нахожу это очень странным... Может кто-нибудь объяснить, почему существует эта разница?