Java 即使我们可以使用下面的代码片段进行深度克隆,为什么还要实现Cloneable

Java 即使我们可以使用下面的代码片段进行深度克隆,为什么还要实现Cloneable,java,interface,clone,cloning,cloneable,Java,Interface,Clone,Cloning,Cloneable,在上面提到的ColoredCircle类中,我们有一个名为testClone()的方法,它的工作原理与深度克隆完全相同。 现在我很困惑,有必要实现克隆到克隆吗? 上述程序是一种深度克隆吗?是否需要实现Cloneable到clone?是。clone()方法具有受保护的访问修饰符,具有以下Javadoc解释:- 此方法创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的浅拷贝,而不是深拷贝操作 您的方法testClon

在上面提到的ColoredCircle类中,我们有一个名为testClone()的方法,它的工作原理与深度克隆完全相同。 现在我很困惑,有必要实现克隆到克隆吗?
上述程序是一种深度克隆吗?

是否需要实现
Cloneable
clone?是。clone()方法具有受保护的访问修饰符,具有以下Javadoc解释:-

此方法创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的
浅拷贝
,而不是
深拷贝
操作

您的方法
testClone
虽然在克隆行为上可能是正确的,但其本身不是一个可克隆对象。可克隆对象必须实现
Cloneable
接口,最好具有对
clone()
的公共访问权限,以便可以在类外使用


重新阅读您的类的人很难理解
testClone()
方法的重要性。
Cloneable
是一个标记接口。
它不包含任何方法

问题是,
clone
方法是在
对象
类中定义的。由于所有类都实现了
对象
类,这意味着所有类都有一个
克隆
方法。
但是,并非所有对象都支持它。他们中的一些人只会抛出一个
CloneNotSupportedException
。但是这个克隆方法是一个
本地
方法,因此这个方法的确切行为在java源代码中是不可见的。因此,它缺乏一些透明度

Cloneable
界面帮助我们识别哪些类是真正可克隆的,哪些不是。按照惯例,不实现
Cloneable
的类将抛出
CloneNotSupportedException

注意:克隆
方法也被标记为受保护
。因此,在支持类中重写它以使其成为公共的也是惯例



JDK1中引入了
clone
设计。如今,人们普遍认为java
clone
设计存在一些缺陷。有些人喜欢只创建一个克隆构造函数(例如,
public Color(Color-toCopy){this.Color=toCopy.Color;}

为了不引发异常,需要实现
Cloneable
接口。(这就是
Cloneable
的全部目的)

您没有使用
Object.clone()
。因此,实现
Cloneable
或不实现都没有效果。它与方法的调用无关。您的方法可以被称为
testClone()
,它最多可以调用
super.clone()
。或者您的方法可能被称为
clone()
,但它不能使用
super.clone()
。重要的是您没有使用
Object.clone()


使用
Object.clone()
的优点是,它返回的对象与调用它的对象具有完全相同的运行时类。另一方面,您的方法总是创建一个新的
彩色圆
对象。因此,当您的
testClone()
方法在子类中继承时,它仍然会创建一个
ColoredCircle
,而不是该子类的实例。然而,如果您的方法调用
super.clone()
,它将能够获取当前实例所属的任何子类的实例。

事实上,现在使用
Cloneable
并实现
clone
被认为是非常糟糕的。因为浅拷贝比深拷贝需要更少的内存。@Real怀疑论者所以我希望没有必要实现可克隆到深克隆?@ArijitDasgupta我没有把你的最后一个问题告诉Real怀疑论者。您可以在名为
sljgfsaja
的方法中实现深度复制。这将完成工作,但不会实现接口
Clonable
。你的客户只需要知道他们必须使用这种方法。如果不使用该接口,就不会有国际Java执法者标记团队踢你的门。。。也许我只是误解了这个问题。不管你是深还是浅。如果未使用
克隆
,则不应实现
可克隆
。由于不鼓励实现
Cloneable
clone
,因此您应该通过其他方式进行深度复制。这取决于您所说的“克隆”的含义。根据合同使用
clone()
方法是否需要实现
Cloneable
?对一般来说,是否需要克隆(复制)对象?不。更可取的是复制构造函数或类似的方法。“这意味着所有类都有一个克隆方法。”但大多数类没有公共的
clone
方法。@newacct确实,你的观点是-我的意思是,我在回答中提到了它,不是吗?除了类本身或它的子类之外,类唯一的“方法”是公共方法。因此,该语句是无用的,因为对于所有效果和目的,对于常规代码,大多数对象都没有一个名为
clone
的可访问方法。你还说“然而,并不是所有的对象都支持它。”这再次将“并非所有”与“所有”形成对比,这再次暗示它们都“拥有它”。但不仅有些对象“不支持”,从类外代码的角度来看,大多数对象甚至根本不“拥有它”。@newacct它总是可以访问的,即使它不是
公共的
。你可以去
public class Color {
 String color;
 Color(String color)
 {
   this.color=color;         
 }
 }


public class ColoredCircle {
int x;
Color color;
ColoredCircle(int x, Color color)
{
    this.x=x;
    this.color=color;
}
public Object testClone()
{
    Color c = new Color(this.color.color);
    ColoredCircle cc1 = new ColoredCircle(this.x, c);
    return cc1;
}
}