复制和克隆有什么区别?

LeW*_*ody 30 c# oop

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

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

它是语言依赖的吗?

小点,但它困扰我...

Ano*_*nym 27

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

通常是什么:

  • 克隆 - 根据存在的东西创建新东西.
  • 复制 - 从存在的东西复制到其他东西(也已经存在).


小智 10

是,有一点不同.就语言依赖性而言,某些语言可以执行所有Shallow,Deep,Lazy复制.有些只做浅版.所以是的,它有时依赖于语言.

现在,以一个数组为例:

int [] numbers = { 2, 3, 4, 5};
int [] numbersCopy = numbers;
Run Code Online (Sandbox Code Playgroud)

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

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

  numbersCopy[2] = 0;
Run Code Online (Sandbox Code Playgroud)

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

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

  System.out.println(numbersCopy[2]);
Run Code Online (Sandbox Code Playgroud)

考虑到两个数组都指向相同的引用,我们会得到:

0

0

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

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

  int [] numbersClone = (int[])numbers.clone();
Run Code Online (Sandbox Code Playgroud)

"numbersClone"数组现在包含相同的值,但在这种情况下,数组对象本身指向的参考不同于"数字"数组.

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

  numbersClone[2] = 0;
Run Code Online (Sandbox Code Playgroud)

现在以下陈述的输出是什么?

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

  System.out.println(numbersClone[2]);
Run Code Online (Sandbox Code Playgroud)

你猜到了:

4

0

资源

  • 您的第一个示例 (`numbersCopy`) 既不是副本也不是克隆,而是引用。 (5认同)

Pet*_*vin 7

最简洁:

  • 复制:复制到现有实例(浅或深)
  • 克隆:复制到新实例(总是深)

由于开发人员草率地交换它们,因此没有达成共识;但是,可以基于以下内容游说上述内容:

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