用Java克隆的目的

时间:2015-02-13 10:20:13

标签: java c++ clone cloneable

我正在经历"特别" Java的特性,并开始阅读克隆。

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

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

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

2 个答案:

答案 0 :(得分:1)

IMO你的问题有两个部分。

  

可克隆界面需要什么?

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

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

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

  

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

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

答案 1 :(得分:0)

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

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

如果你真的想要这样做,你最终可以互换这两个,但实际上它们有不同的用途,并且当一个人应该使用而不是另一个时,要清楚明白是非常有用的。

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

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