2015-07-09 89 views
0

Temp1 t1=new Temp2(); 這裏Temp1是Temp2的超類。代碼工作得很好,並且t1做爲Temp1的參考變量,但Temp2()如何作爲Temp1的構造函數?創建對象時的尷尬

+0

你混淆的對象,變量和引用。 (和類型繼承。) –

+2

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

+0

t1在這種情況下在運行時是Temp2類型,而不是Temp1 – BoDidely

回答

2

這是polymorphism的基礎:假設您有幾個繼承自父類的子類。您希望通過父類上定義的接口/方法來使用所有這些子類,而不必擔心每個子類中的實現細節(每個類可能會做不同的事情,但具有相同的整體語義)。

這是可能的,因爲子類從父類繼承,因此子類與其父類具有IS A關係。

0

但Temp2()如何作爲Temp1的構造函數?

它沒有。這是另一種方式。它是作爲參考的Temp1 t1,其可以容納任何種類的對象形式Tempt1系列,並且因爲Temp2 extends Temp1它被認爲是Type1的類型。

這是完全安全的,因爲Type2繼承了Type1所有成員,所以沒有一些方法或字段上調用t1參考將嘗試執行/使用一些未定義的方法/變量的風險。

同樣由於多態性(或更精確地late-binding - 檢索以及基於實例類型的運行時方法的執行代碼時,不引用類型)的Type2方法將被調用,而不是Type1。這使我們可以擁有抽象類和接口。

0
T1 do act as reference variable for Temp1 

不,實際上T1變量是類型TEMP1的充當參考變量爲TEMP2

but how can Temp2() works as constructor for Temp1 

繼承是面向對象的特性由子類繼承父類的所有屬性,在這種情況下TEMP2是繼承自其超temp1中所有方法子類。因此temp2是一種temp1系列,因此Temp2構造函數可以通過Temp1引用變量(t1)引用。

您必須閱讀:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html