【问题标题】:What does it mean to clone() an object?clone() 一个对象是什么意思?
【发布时间】:2009-11-17 15:19:46
【问题描述】:

什么是 vb6 或 java 中的对象克隆?我们在什么情况下使用克隆?克隆对象是什么意思?谁能告诉我一个例子吗?

【问题讨论】:

  • 对于有经验的人来说似乎很明显,但初学者经常会遇到“嘿,为什么我的对象在我改变了这个'另一个'时改变了”。名称基本上是修饰指针的认识来得很慢(并且理解克隆大大加快了这个过程)。

标签: clone


【解决方案1】:

克隆实际上是将对象数据复制到一个新对象中。

这个例子没有克隆数据:

Foo p = new Foo();
Foo o = p;

如果Foo 有一个成员a,而您更改了p.a,那么o.a 也会发生变化,因为po 都指向同一个对象。

然而,

Foo p = new Foo();
Foo o = p.Clone();

在这种情况下,如果您更改 p.a,则 o.a 保持不变,因为它们实际上指向不同的对象。

实际上有两种不同的克隆方式:浅克隆或深度克隆。

浅克隆只是创建一个新对象并将成员复制到新对象中。这意味着如果其中一个成员实际上是指向另一个对象的指针,则该对象将在旧对象和新对象之间共享。

深度克隆实际上会通过并将所有成员克隆到新对象中。这样,对象就是所有数据的完整副本。

【讨论】:

  • 顺便说一句,还有第三种克隆方式——语义级克隆。例如的语义级克隆List 将是一个新列表,其中包含与旧列表相同的项目。
  • @supercat - 这与列表的浅层克隆有何不同?
  • @Aaron:假设集合被实现为对数组的引用以及有效项的计数。持有此类集合的对象的浅表克隆将是具有复制的有效项计数但引用与原始项相同的项数组的新对象。语义级克隆将具有复制的计数和对数组浅克隆的引用。
  • @Aaron:对对象进行语义级克隆的一个好方法是从浅层克隆开始,然后克隆对象“知道”的所有字段。对象通常不应公开浅克隆功能,而应仅在内部使用。
  • @supercat - 我明白了 - 语义级克隆就像了解复杂对象内部的浅层克隆。很高兴知道。
【解决方案2】:

一般来说,对象是通过引用传递的。所以如果你说$objB=$objA 你没有得到一个新对象;您将获得同一对象的新名称。但是,如果你说$objB= clone $objA,你会得到一份$objA 的副本。在第一种情况下,您对$objB 所做的任何事情也会发生在$objA 上。在第二种情况下,$objB 是独立的。

【讨论】:

    猜你喜欢
    • 2011-06-12
    相关资源
    最近更新 更多