1

我正在浏览 Java 的“特殊”功能,并开始阅读有关克隆的内容。

所以目前我所理解的是克隆可用于获取对象的相同副本。为此,您需要实现 Cloneable 接口并覆盖 Object 的 clone 方法(这在 IMO 中真的很奇怪)

我的问题更多是针对 C++ 和 Java 之间的比较。当我们已经支持复制构造函数时,为什么需要一个单独的克隆方法。为什么克隆被认为是必须具有的特征,是否有历史原因?

PS:我不是在问“克隆”的需要,因为在 Java 中克隆对象的需要是什么,我问的是当 Java 已经支持复制构造函数时需要 Cloneable 和 clone 方法。

4

2 回答 2

1

国际海事组织你的问题有两个部分。

Cloneable接口需要什么?

Cloneable 接口也称为标记接口,这意味着它没有任何方法,其全部目的是告诉您,该类的用户,它实现了从 Object 继承的clone()方法。这使您可以在调用 clone() 方法之前进行检查:

Animal a = new Dog();
Animal b;
if (a instanceof Cloneable)
    b = a.clone();

这在 Java 中经常发生。参见例如Serializable接口。

为什么 Java 需要一个clone()方法,因为它已经有了复制构造函数?

非常简短的回答是多态性。如果您没有clone()方法,您将如何通过对 Animal(它的超类)的引用正确克隆 Dog 实例?

于 2015-02-13T10:39:07.643 回答
0

克隆旨在提供对象的单独实例,而不会破坏克隆的对象。它在原型模式中非常有用(这是必须的)。

复制构造函数通常在 C++ 中通过值传递时调用(您也可以在构造时使用它,但通常在将对象作为参数或返回值通过堆栈传递时调用它)。因此,初始对象经常超出范围。

如果您真的想这样做,您最终可以将这两者互换,但实际上它们有不同的目的,并且明确何时应该使用一个而不是另一个是非常有帮助的。

除了名称的歧义之外,您还需要考虑多态性,您希望从基指针克隆对象。

将在指针类型上调用复制构造函数,而在最派生的实现上调用 clone(如果是虚拟的,就像它应该是一样的)。

于 2015-02-13T10:43:20.637 回答