我正在经历"特别" Java的特性,并开始阅读克隆。
所以目前我所理解的是Cloning可用于获取对象的相同副本。为此,您实现Cloneable接口并覆盖Object的克隆方法(这真的很奇怪IMO)
我的问题更多的是C ++和Java之间的比较。当我们已经支持复制构造函数时,为什么需要单独的克隆方法。是否存在一个历史原因,为什么克隆被认为必须具有特征?
PS:我不是在问克隆"克隆"就像在what is the need of cloning a object in Java中一样,当Java已经支持复制构造函数时,我要问的是Cloneable和clone方法的需要。答案 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(如果是虚拟的,就像它应该的那样)。