复制和克隆有什么区别?
答
有没有关于这些概念的正式定义,至少不是一个跨越所有语言。
什么是平时常见的,但:
- 克隆 - 创造新的东西基于东西存在。
- 复制 - 从存在的东西复制到其他东西(也已存在)。
答
在C++ - 地“克隆”通常是成语深度复制多态类对象。
在Java/C#中,我怀疑这些术语可以更多地交换使用。
答
我会说复制和克隆是类似的术语。你应该知道的唯一的事情是你得到浅拷贝和深拷贝。浅拷贝仅在根级创建对象的副本,其中深拷贝将生成对象及其所有子对象的副本。
答
是的,有区别。至于语言依赖性,一些语言可以完成所有浅,深,懒惰的复制。有些只做浅的副本。所以是的,有时候这是语言依赖的。
现在,采取例如阵列:
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]);
你猜对了:
答
最简洁:
- 副本:复制到现有实例(浅或深)
- 克隆:复制到新的实例(总深)
为开发商拖泥带水没有达成共识交换他们;然而,人们可以基于以下方式游说以上内容:
- 词源(生物学)意味着“浅层克隆”的概念是荒谬的,因为不是基因相同;克隆意味着完整性以传播实体。
- 复制历史意味着复制到现有介质上(复制书本或绘画等)。例如,复印件将图像复制到现有纸张上;如果有人能够克隆一张纸,结果会是一张新纸。
- 可以“复制”一个对象引用,但永远不会“克隆”一个对象引用。
我不相信他们的相对含义有任何明确的共识。 – 2010-02-04 14:38:08