maracaibo25 ha scritto:
compilandolo esce "DerivedB DerivedB ", io avevo pensato che b1 diventasse un oggetto di tipo Base e quindi stampasse "Base" e b4 "DerivedA" dato che gli viene passato un'oggetto di tipo DerivedB castato in DerivedA
Il ragionamento da fare è questo:
b1.test ();
b1 è una variabile di tipo Base e gli viene assegnato il valore di b3. Nota che il cast (Base) NON cambia nulla (ed è di fatto inutile). L'oggetto realmente assegnato a b3 e quindi b1 è un DerivedB. Quindi siccome DerivedB
ridefinisce il test() è questo di DerivedB quello che viene realmente eseguito.
b4.test ();
b4 è una variabile di tipo Base e gli viene assegnato il valore di b3. Nota che il cast (DerivedA) è un
narrowing ("down" cast) perché b3 è di tipo Base e la JVM deve verificare a runtime se l'oggetto realmente assegnato
è-un DerivedA. Siccome l'oggetto assegnato a b3 è un DerivedB che estende DerivedA, il cast a runtime ha successo. Ma NON cambia nulla nell'oggetto! L'oggetto è comunque realmente un DerivedB. Quindi anche qui il test() eseguito è quello di DerivedB.