2013-04-25 57 views
14

考慮下面的類後失去其獨特的性能:是否子對象鑄造來回父類之間

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

如果我是創造的Blackberry的情況下,其轉換爲Phone對象,然後把它重新回到Blackberry,原來的Blackberry對象會失去它的成員變量嗎? E.g:

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

你試過了嗎?你做了什麼事? – Kal 2013-04-25 20:39:27

+0

我確實嘗試過,它工作正常 – 2013-04-25 20:46:18

回答

22

鑄造不改變根本目的不惜一切 - 它只是一個消息編譯器,它可以把一個A作爲B

它也沒必要投的AB如果A extends B,即你不需要投一個亞型其超;你只需要投,如果是從父到子類型

9

如果我是創造黑莓的一個實例,將其轉換爲一個電話 對象,然後將它轉換回黑莓,將原來的 黑莓對象失去其成員變量?

您已經實例化了一個Blackberry。這將保持Blackberry,直到它被GCed。
當您將其轉換爲Phone時,您不會更改類型爲Blackberry的事實。您只是將其視爲Phone,即您只能訪問其通用屬性(即Phone)。
Blackberry的擴展屬性不再可見,儘管具體實例仍然是Blackberry,並且您可以成功將其重新轉換爲訪問Blackberry屬性。