2013-07-31 54 views
7

我一直認爲clone()在不調用構造函數的情況下創建一個對象。克隆方法使用構造函數創建對象

但是,在閱讀有效的Java 項目11:覆蓋克隆明智,我發現它說,

的規定,即「無構造被稱爲」太強烈的聲明。行爲良好的克隆方法可以調用構造函數來創建在建的克隆內部的對象 。如果該類是最終的,克隆 甚至可以返回由構造函數創建的對象。

有人可以向我解釋這個嗎?

+1

'clone()'方法不調用構造函數,它的默認行爲是執行淺拷貝。但是如果我們想執行深層複製,我們需要重寫'clone()'方法,從中我們可以返回新的Object。 – swapy

回答

12

我一直認爲clone()創建一個對象而不調用構造函數。

Object.clone()中的實現不調用構造函數。

沒有什麼可以阻止你自己以某種方式實現它。例如,這是一個完全有效的clone()實現:

public final class Foo implements Cloneable { 
    private final int bar; 

    public Foo(int bar) { 
     this.bar = bar; 
    } 

    @Override 
    public Object clone() { 
     return new Foo(bar); 
    } 
} 

你只能做到這一點(無條件)如果類是final,因爲這樣可以保證將返回相同的類型與原始的對象。

如果該類不是終點,我想你可能檢查的實例是否是「公正」的類型的實例覆蓋clone(),並在不同情況下不同的方式處理這...這將是奇數這麼做雖然。

+0

爲什麼我只有在班級是最後的時候才能做到這一點?如果我在非最終課上做這個,會有什麼樣的影響? – Anand

+2

@Anand:'clone()'必須返回與原始類型相同的實例。如果這個類不是最終的,你必須考慮'this'將引用一個子類的實例的可能性。 –

相關問題