2013-10-14 68 views
0

我正在閱讀有關在Java中將超類變量強制轉換爲子類的反例。請告訴哪些是有效的?在java中將子類變量強制轉換爲超類

Cat c = new Cat(); 
Animal a = c; 

Animal a = new Animal(); 
Cat c = (Cat) a; 

Animal a = new Cat(); 
Cat c = (Cat) a; 

Cat c = new Cat(); 
Dog d = (Dog) c; 

動物是與貓和狗子類的超級類。

+4

嘗試一下,看看第一。 –

+0

你爲什麼不編譯它們看看? –

+0

我的猜測是沒有一個演員陣容是有效的,因爲'貓'和'狗'不是任何類型的。 – Bart

回答

0
Cat c = new Cat(); 
Animal a = c; 

Animal a = new Cat(); 
Cat c = (Cat) a; 
+0

第一個你有在那裏iffy,如果貓的構造函數設置了一些其他的東西? –

+0

如果貓吃了狗,該怎麼辦? – Troubleshoot

+0

把它投給老虎,也許 –

0

第三個是不錯的方法acat,其他都是廢話危險的編譯器是否會允許它們。

+0

」。第一個也可以。這與將變量傳遞給期望超類的方法或將項添加到該項的超類型列表完全相同。當然這有點愚蠢,但這似乎是一個人爲我做的早期作業。 –

+0

不,它不是,如果你通過貓作爲動物,那麼你只會調用動物中定義的方法。貓的任何額外的屬性或方法不會按預期工作。也可能將它投射到蟑螂。 –

+0

如果他們被定義爲虛擬(或者因爲我們使用Java而不是最終的)或者被覆蓋,他們會工作得很好。如果它們是新的方法或屬性(所以在Cat上定義,但不在Animal上),它們只會通過Animal變量無法訪問。這是整個繼承點。如果貓和動物不這樣做,這是一個壞設計的肯定標誌(違反Liskov替代原則)。 –