2010-02-04 131 views
30

在編程方面有沒有關於此的權威性參考?複製和克隆有什麼區別?

我看到很多人把深拷貝和克隆都稱爲同一件事情。這是真的?

它是否依賴於語言?

小點,但它困擾着我......

+3

我不相信他們的相對含義有任何明確的共識。 – 2010-02-04 14:38:08

回答

26

有沒有關於這些概念的正式定義,至少不是一個跨越所有語言。

什麼是平時常見的,但:

  • 克隆 - 創造新的東西基於東西存在。
  • 複製 - 從存在的東西複製到其他東西(也已存在)。
1

在C++ - 地「克隆」通常是成語深度複製多態類對象。

在Java/C#中,我懷疑這些術語可以更多地交換使用。

2

我會說複製和克隆是類似的術語。你應該知道的唯一的事情是你得到淺拷貝和深拷貝。淺拷貝僅在根級創建對象的副本,其中深拷貝將生成對象及其所有子對象的副本。

9

是的,有區別。至於語言依賴性,一些語言可以完成所有淺,深,懶惰的複製。有些只做淺的副本。所以是的,有時候這是語言依賴的。

現在,採取例如陣列:

int [] numbers = { 2, 3, 4, 5}; 
int [] numbersCopy = numbers; 

的「numbersCopy」陣列現在包含相同的值,但更重要的是該陣列對象本身指向同一對象引用爲「數字」的數組。

所以,如果我做這樣的事情:

numbersCopy[2] = 0; 

會是怎樣下列語句的輸出?

System.out.println(numbers[2]); 

    System.out.println(numbersCopy[2]); 

考慮兩個陣列指向同一個參考,我們將得到:

但是,如果我們想使第一陣列的不同副本都有自己的什麼參考?那麼在那種情況下,我們想克隆這個數組。爲此,每個數組現在都有自己的對象引用。讓我們看看這將如何工作。

int [] numbers = { 2, 3, 4, 5}; 

    int [] numbersClone = (int[])numbers.clone(); 

的「numbersClone」陣列現在包含相同的值,但在這種情況下,陣列對象本身指向比「數字」陣列的不同的參考。

所以,如果我做這樣的事情:

numbersClone[2] = 0; 

什麼是輸出現在下面的語句?

System.out.println(numbers[2]); 

    System.out.println(numbersClone[2]); 

你猜對了:

Source

3

最簡潔:

  • 副本:複製到現有實例(淺或深)
  • 克隆:複製到新的實例(總深)

爲開發商拖泥帶水沒有達成共識交換他們;然而,人們可以基於以下方式遊說以上內容:

  1. 詞源(生物學)意味着「淺層克隆」的概念是荒謬的,因爲不是基因相同;克隆意味着完整性以傳播實體。
  2. 複製歷史意味着複製到現有介質上(複製書本或繪畫等)。例如,複印件將圖像複製到現有紙張上;如果有人能夠克隆一張紙,結果會是一張新紙。
  3. 可以「複製」一個對象引用,但永遠不會「克隆」一個對象引用。