2013-04-25 18 views
14

Rozważmy następujące klasy:Czy obiekt dziecko straci swoje unikalne właściwości po odlaniu iz powrotem między klasą dominującą

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

Gdybym miał stworzyć instancję Blackberry, wrzucił je do Phone obiektu, a następnie oddać go z powrotem do Blackberry, czy oryginalny obiekt Blackberry straciłby swoje zmienne składowe? Np:

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

Czy próbowałeś? Co się stało, kiedy to zrobiłeś? – Kal

+0

Zrobiłem to i zadziałało dobrze –

Odpowiedz

22

Casting w ogóle nie zmieniać U podstaw - to tylko wiadomość dla kompilatora, że ​​można go traktować jako BA.

Nie jest również konieczne rzutowanie numeru A na B, jeśli nie ma potrzeby rzucania podtypu do jego nadtypu; trzeba tylko do obsady czy to z supertypem do podtypu

9

Gdybym miał stworzyć instancję Blackberry, wrzucił je do telefonu obiektu, a następnie wrzucił go z powrotem do Blackberry, by oryginalny Blackberry przedmiot stracić swoje zmienne składowe?

Utworzono numer Blackberry. Pozostanie to Blackberry, dopóki nie pojawi się GCed.
Po przesłaniu go do numeru Phone nie zmieniasz faktu, że typem jest Blackberry. Po prostu traktujesz to jako Phone, tzn. Masz dostęp tylko do jego ogólnych właściwości (to jest Phone).
Rozszerzone właściwości Blackberry nie są już widoczne, mimo że konkretną instancją jest nadal Blackberry i można z powodzeniem przesłać ją z powrotem, aby uzyskać dostęp do właściwości Blackberry.