【发布时间】:2011-01-13 02:41:34
【问题描述】:
在编程中是否有明确的参考?
我看到很多人将深度复制和克隆称为同一件事。这是真的?
它依赖于语言吗?
一个小问题,但它让我很困扰......
【问题讨论】:
-
我认为对于它们的相对含义没有任何明确的共识。
在编程中是否有明确的参考?
我看到很多人将深度复制和克隆称为同一件事。这是真的?
它依赖于语言吗?
一个小问题,但它让我很困扰......
【问题讨论】:
这些概念没有正式的定义,至少没有一个涵盖所有语言的定义。
但通常是什么:
【讨论】:
是的,有区别。就语言依赖而言,有些语言可以进行所有的 Shallow、Deep、Lazy 复制。有些只做浅拷贝。所以是的,它有时取决于语言。
现在,以数组为例:
int [] numbers = { 2, 3, 4, 5};
int [] numbersCopy = numbers;
“numbersCopy”数组现在包含相同的值,但更重要的是,数组对象本身与“numbers”数组指向相同的对象引用。
所以如果我要这样做:
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”数组现在包含相同的值,但在这种情况下,数组对象本身指向的引用与“numbers”数组不同。
所以如果我要这样做:
numbersClone[2] = 0;
以下语句现在的输出是什么?
System.out.println(numbers[2]);
System.out.println(numbersClone[2]);
你猜对了:
4
0
【讨论】:
numbersCopy) 既不是副本也不是克隆,而是参考。
最简洁:
由于开发人员草率地互换它们,因此没有达成共识;但是可以根据以下内容游说上述内容:
【讨论】:
我会说复制和克隆是类似的术语。您可能应该知道的唯一一件事是您会获得浅拷贝和深拷贝。浅拷贝仅在根级别复制对象,而深拷贝将生成对象及其所有子对象的副本。
【讨论】:
在 C++ 领域,“克隆”通常用于深度复制多态类的对象。
在 Java/C# 中,我怀疑这些术语可以互换使用。
【讨论】: