2015-04-27 82 views
2

比方說,我有一個超類Animal,以及Dog的一個子類。爲什麼在java中這是不允許的?

我們可以上溯造型說:

Animal a = new Dog(); 

我們不能說垂頭喪氣:

Dog b = new Animal(); 

所以我也明白,一個動物不一定是狗。但是,爲什麼要在狗容器中製作動物「藍圖」會引發異常?因爲Dog繼承了Animal的方法,所以當我們把這個動物放進一個狗容器時,我們知道Dog繼承/覆蓋了Animal所有的方法,那麼爲什麼Java不允許這樣呢?

謝謝!

+0

想一想,當你說動物時,你不能自動承擔它的狗。但你可以反過來 –

回答

4
Dog b = new Animal(); 
b.Woof(); 

動物沒有接口/方法稱爲Woof()。它不知道如何像狗一樣行事,但所有的狗都知道如何像動物一樣行事。

2

簡答:因爲狗是動物,但動物不一定是狗。

稍微長一些的答案:如果你能夠做到這一點,你可以在Animal對象上調用Dog方法,而不必定義這些方法。

1

雖然我們知道狗包括動物的所有方法,但我們不知道動物包括狗的所有方法。

考慮例如狗是否添加方法bark()。我們應該可以在任何類型的Dog對象上調用bark();但如果我們可以在那裏存儲動物,我們可以存儲任何類型的動物,比如貓。然後,我們會發現我們要求一隻貓吠叫(),並且有些事情會變得非常錯誤。

我們可以說,狗動物和貓動物,但我們不能說,一個動物狗,或一隻貓狗。因此,如果我們的變量「是狗」,那麼存儲動物就沒有意義了。

相關問題