复制和克隆有什么区别?

时间:2010-02-04 14:36:28

标签: c# oop

编程中是否有明确的参考资料?

我看到很多人将深度复制和克隆称为同一件事。这是真的?

语言是否依赖?

小点,但它困扰我......

5 个答案:

答案 0 :(得分:26)

这些概念没有正式的定义,至少没有跨越所有语言的概念。

虽然通常是常见的:

  • clone - 根据存在的东西创建新内容。
  • 复制 - 从存在的东西复制到其他东西(也已经存在)。

答案 1 :(得分:10)

是的,有区别。就语言依赖性而言,某些语言可以执行所有Shallow,Deep,Lazy复制。有些只做浅版。所以是的,它有时依赖于语言。

现在,以一个数组为例:

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

“numbersCopy”数组现在包含相同的值,但更重要的是,数组对象本身指向与“数字”数组相同的对象引用。

所以,如果我做的事情如下:

  numbersCopy[2] = 0;

以下陈述的输出结果是什么?

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

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

考虑到两个数组都指向相同的引用:

0

0

但是如果我们想用自己的引用制作第一个数组的独特副本呢?那么在这种情况下我们想要克隆数组。这样做,每个数组现在都有自己的对象引用。让我们看看它将如何运作。

  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]);

你猜对了:

4

0

Source

答案 2 :(得分:3)

最简洁:

  • copy:复制到现有实例(浅或深)
  • clone:复制到新实例(总是很深)

没有达成共识,因为开发人员轻易地互相交换;然而,人们可以根据以下内容游说上述内容:

  1. 词源(生物学)暗示“浅克隆”的概念是荒谬的,因为它不是基因相同的;克隆意味着完整性以传播实体。
  2. 历史上的复制意味着复制到现有媒体上(复制书籍或绘画等)。例如,复印件将图像复制到现有的纸张上;如果有人能以某种方式克隆一张纸,结果将是一张新纸。
  3. 可以“复制”对象引用,但永远不会“克隆”对象引用。

答案 3 :(得分:2)

我想说复制和克隆是类似的术语。你唯一应该注意的是你得到浅拷贝和深拷贝。浅拷贝仅在根级别创建对象的副本,而深拷贝将生成对象及其所有子对象的副本。

答案 4 :(得分:1)

在C ++中 - 土地“克隆”通常是深层复制多态类对象的惯用语。

在Java / C#中,我怀疑这些术语可以互换使用。