2017-08-11 61 views
-4

我現在看一個java的書,我堅持一個例子,包括這一行:「鳥雀=新天鵝()」的含義

Bird titi = new Swan(); 

其中天鵝是鳥的子類。

我可以解釋這個如下:

時的java執行該線,它的值存儲蒂蒂存儲器,並且存儲器存儲的數據可以包含類型鳥的對象的信息。接下來,該行的第二部分調用Swan構造函數,不帶任何參數,它初始化titi值。

如果我是對的,我不能解釋爲什麼一個Swan實例可以存儲在一個Bird類型中,因爲Swan作爲一個子類包含比Bird更多的信息。 所以我覺得我錯了。哪裏?

和,額外問題:在這種情況下,這種類型的說明是有用的?

謝謝

+1

https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – luk2302

+1

請記住,Java中的「變量」實際上只是一個**引用** - 所以你沒有分配一個爲了適應'Bird'而需要的內存塊,然後必須擠壓所有'Swan'數據,你正在向其他地方提供新的固定大小的引用。當你調用對象構造時,那個「其他地方」的數據就會被定義,所以在這裏它變成了一個'Swan'。 – hnefatl

回答

1
Bird titi = new Swan(); 

實際上被稱爲:編程到超類但有時面向接口編程

指:

titi一個Bird指向一個天鵝參考...請注意,這只是因爲繼承有效......這意味着在這種情況下,Swan是一個擴展Bird類的類

原因:它允許在代碼中進行修改...你可以後決定不使用一個天鵝,但貓頭鷹所以

Bird titi = new Swan();Bird titi = new Owl();被替換,一切都將正常工作

編程接口是更優雅,因爲你可以這樣做:

IFly titi = new Swan(); 

這是有效的,如果天鵝implemtents接口IFly,所以它是:

titi是東西,可以飛,指向Swan ref。

1

您可能會有隻需要的Bird實例的方法。由於SwanBird,因此您可以使用Swan的實例並將其視爲Bird

這就是多態性的美妙之處。它允許你在不破壞代碼的其餘部分的情況下更改類內部的實現。

1

調用新Swan()的地方,它在內存中創建一個新的Swan對象。

當Swan對象被賦值給Bird變量時(可能是因爲Swan是Bird的子類型),Bird變量只是在內存中有一個指向Swan的指針。因爲titi是一個動詞,所以現在可以像靜態時間類型檢查和功能一樣訪問/處理此對象......雖然它總是天鵝,並且可以投射到天鵝以擴展天鵝功能。

+0

Nitpick:「Bird變量只是指向內存中的Swan的指針」,不是指針而是引用,JVM可以使用它來在內存中定位對象(它不需要是其當前內存地址)。 – Pshemo

0
Bird titi = new Swan(); 

這全是關於多態性。

A Parent class /接口類型可以容納它的Child class的Object。

這裏的鳥是父類/接口和天鵝是孩子。

同樣的例子如下:

List list = new ArrayList(); 

這裏List是家長InterafceArrayList其子類。