在 Java 中克隆的目的

Purpose of cloning in Java

我正在研究 Java 的 "special" 功能,并开始阅读有关克隆的内容。

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

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

PS:我不是在问 what is the need of cloning a object in Java 中是否需要 "clone",我问的是当 [=22] 时是否需要 Cloneable 和克隆方法=] 已经支持复制构造函数。

IMO 你的问题有两部分。

What is the need for the Cloneable interface?

Cloneable接口也被称为标记接口,这意味着它没有任何方法,它的全部目的是告诉你,那个[=的用户32=],它实现了继承自 Object 的 clone() 方法。这使您能够在调用 clone() 方法之前进行检查:

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

这种情况在 Java 中经常发生;例如,参见 Serializable 接口。

Why does Java need a clone() method at all, as it already has copy constructors?

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

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

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

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

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

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