Nel seguente esempio:Chiamare un metodo sovrascritto da un costruttore
class Base {
int x=10;
Base() {
show();
}
void show() {
System.out.print ("Base Show " +x + " ");
}
}
class Child extends Base {
int x=20;
Child() {
show();
}
void show() {
System.out.print("Child Show " + x +" ") ;
}
public static void main(String s[ ]) {
Base obj = new Child();
}
}
- Perché l'output come mostrato di seguito
Child Show 0 Child Show 20
- ho pensato costruttori posso solo accedere ai membri dell'istanza una volta che è il suo super costruttore s hanno completato.
Penso che quello che sta accadendo qui è che il super costruttore sta chiamando il metodo show() del bambino perché questo metodo è stato sovrascritto in Child. come è stato sovrascritto, ma perché è il valore di x 0 e perché è in grado di accedere a questo metodo prima che il super costruttore sia completato?
esprime meccanismo di movimentazione virtuale abilitato durante la costruzione di un oggetto? Dubito che non lo sia. – Mahesh
In C++ questo può causare un arresto anomalo. –
Efficace Java è una grande risorsa Java e ci si occupa in dettaglio. Dall'elemento 17: "*** I costruttori non devono invocare metodi overridable **, direttamente o indirettamente (...) Se il metodo di override dipende da qualsiasi inizializzazione eseguita dal costruttore della sottoclasse, il metodo non si comporterà come previsto. ... * "Se hai il libro a portata di mano consiglio vivamente di leggere questo articolo. –