2010-02-04 1008 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. 可以“复制”一个对象引用,但永远不会“克隆”一个对象引用。