2013-04-25 8 views
14

Considerate le seguenti classi:Does un oggetto figlio perde le sue proprietà uniche dopo il getto avanti e indietro tra una classe genitore

public class Phone { 
    private boolean has3g; 

    public boolean has3g() { 
     return has3g; 
    } 

    public void setHas3g(boolean newVal) { 
     has3g = newVal; 
    } 
} 

public class Blackberry extends Phone { 
    private boolean hasKeyboard; 

    public boolean hasKeyboard() { 
     return hasKeyboard; 
    } 

    public void setHasKeyboard(boolean newVal) { 
     hasKeyboard = newVal; 
    } 
} 

Se dovessi creare un'istanza di Blackberry, gettato in un oggetto Phone e poi ricollocato su Blackberry, l'oggetto originale Blackberry perde le sue variabili membro? Per esempio:

Blackbery blackbery = new Blackberry(); 
blackbery.setHasKeyboard(true); 

Phone phone = (Phone)blackbery; 

Blackberry blackberry2 = (Blackberry)phone; 

// would blackberry2 still contain its original hasKeyboard value? 
boolean hasKeyBoard = blackberry2.hasKeyboard(); 
+0

Hai provato? Cosa è successo quando l'hai fatto? – Kal

+0

Ho provato e ha funzionato bene –

risposta

22

Casting non cambia l'oggetto sottostante a tutti - è solo un messaggio al compilatore che si può trattare un A come B.

Non è inoltre necessario trasmettere un A a B se A extends B, ad esempio non è necessario eseguire il cast di un sottotipo per il suo supertipo; è necessario solo il cast se è da un supertipo a un sottotipo

9

Se dovessi creare un'istanza di Blackberry, il cast in un oggetto Phone e poi gettato di nuovo a Blackberry, sarebbe il oggetto Blackberry originale perdere le sue variabili membro?

È stato istanziato uno Blackberry. Questo rimarrà un Blackberry fino a quando non è GCed.
Quando lo trasmetti a Phone non stai cambiando il fatto che il tipo è Blackberry. Lo stai solo trattando come Phone, cioè hai accesso solo alle sue proprietà generiche (quella di Phone).
Le proprietà estese di Blackberry non sono più visibili nonostante il fatto che l'istanza di calcestruzzo sia ancora Blackberry e che sia possibile eseguire nuovamente il cast per accedere alle proprietà Blackberry.

Problemi correlati