可以說我擁有超類A,具有克隆界面和深度重載克隆方法。通用java覆蓋克隆方法
我也有一個子類B.
B Temp = new B();
B Temp_Clone = (B) Temp.clone();
方法Temp.clone()返回到克隆的超類A的引用,是嗎?
從我的理解,我不能把一個超類的引用放在子類對象中,對吧?
那麼我在這裏寫的代碼是如何可能的?因爲鑄造?
謝謝。
可以說我擁有超類A,具有克隆界面和深度重載克隆方法。通用java覆蓋克隆方法
我也有一個子類B.
B Temp = new B();
B Temp_Clone = (B) Temp.clone();
方法Temp.clone()返回到克隆的超類A的引用,是嗎?
從我的理解,我不能把一個超類的引用放在子類對象中,對吧?
那麼我在這裏寫的代碼是如何可能的?因爲鑄造?
謝謝。
的類對象的clone()方法創建並返回 對象的副本,具有相同的類和與具有相同 值的所有字段。但是,Object.clone()將引發CloneNotSupportedException異常 ,除非對象是實現標記爲 接口Cloneable的類的實例。
方法Temp.clone()返回到克隆的超類A的引用,是嗎?
沒錯。
從我的理解,我不能在子類對象中引用超類,對吧?
錯誤。
那麼我在這裏寫的代碼是如何可能的?因爲鑄造?
我不知道你認爲這是不可能的,但鑄件肯定是必需的。
那麼,因爲B Temp_Clone是一個子類,另一方面,Temp.clone()是一個超類,你怎麼能夠引用一個超類到一個子類對象呢? – user2102697 2013-04-06 15:06:38
@ user2102697 A.clone()返回當前對象的一個克隆,無論它的類型是什麼,它必須是定義的或擴展的A,但它被類型爲object的類型*再次定義,所以類型轉換是必要的。這一切都直接來自方法簽名及其在Javadoc中的規範。 – EJP 2013-04-24 10:35:15
@onepotato OP表示A是B的超類。 – EJP 2013-04-24 10:35:44
那麼,如果A中的代碼調用super.clone,那麼在調用Temp.clone時創建的對象就是B類型的對象,因爲clone不會調用構造函數!克隆方法在對象類中實現爲本地類和預成形智能副本並創建與此對象相同的對象。所以ClonedTemp來自B型。
爲什麼不移除轉換以查看編譯器是否返回錯誤或不知道最後一個問題?無論如何,我想如果你這樣做,你會得到一個編譯錯誤;當通過子對象引用變量引用超級對象時需要進行轉換。並看看下面的@EJP答案,我認爲這是你的問題的最佳答案。 – 2013-04-06 11:27:09