Oggi sono incappato in qualche strano comportamento di classe interno (non statico).Comportamento membro diverso della classe interna se la classe interna estende la classe esterna?
Se ho le seguenti classi ...
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();
... tutto sembra essere chiaro. L'istanza di InnerB appartiene all'istanza di B quindi se dovesse restituire val stamperà il valore già sostituito 'new'.
MA se la classe interna estende la classe esterna, questo non funziona.
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!
Se ho uno sguardo ai costruttori Vedo anche che una nuova istanza di B verrà creato se si crea un'istanza di InheritedB.
Trovo questo molto strano ... Qualcuno può spiegare perché c'è questa differenza?
Sei sicuro che non intendevi "InheritedB estende InnerB'? – user3707125
Solo per la mia tranquillità, per favore dimmi che non hai intenzione di farlo in codice reale, che stavi solo scherzando per vedere cosa è successo. – jpmc26