2013-04-25 7 views
14

Betrachten Sie die folgenden Klassen hin und her zwischen einer übergeordneten Klasse Gießen:Hat ein Objekt Kind seine einzigartigen Eigenschaften verlieren, nachdem

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; 
    } 
} 

Wenn ich eine Instanz von Blackberry zu schaffen war, es zu einem Phone Objekt gegossen und dann wirft es zurück zu Blackberry, würde das ursprüngliche Blackberry Objekt seine Mitgliedsvariablen verlieren? Z. B:

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

Haben Sie es versucht? Was ist passiert, als du es getan hast? – Kal

+0

Ich habe es versucht und es hat gut funktioniert –

Antwort

22

Casting das darunter liegende Objekt gar nicht ändern - es ist nur eine Nachricht an den Compiler, dass es eine A als B behandeln kann.

Es ist auch nicht erforderlich, A an B zu senden, wenn A extends B, d. H. Sie müssen keinen Subtyp in den Supertyp umwandeln; Sie brauchen nur die Besetzung, wenn es von einem Supertyp zu einem Subtyp ist

9

Wenn ich eine Instanz von Blackberry zu erstellen war, es zu einem Telefon Objekt geworfen und es dann zu Blackberry zurückgeworfen, würden das ursprüngliche Blackberry Objekt Verliere seine Mitgliedsvariablen?

Sie haben eine Blackberry instanziiert. Dies wird ein Blackberry bleiben, bis es GCed ist.
Wenn Sie es in Phone umwandeln, ändern Sie nicht die Tatsache, dass der Typ Blackberry ist. Sie behandeln es nur als Phone, d. H. Sie haben nur Zugriff auf seine generischen Eigenschaften (die von Phone).
Die erweiterten Eigenschaften von Blackberry sind nicht mehr sichtbar, obwohl die konkrete Instanz immer noch eine Blackberry ist und Sie können sie erfolgreich zurückwerfen, um auf die Blackberry-Eigenschaften zuzugreifen.

Verwandte Themen