Java 即使我们可以使用下面的代码片段进行深度克隆,为什么还要实现Cloneable
在上面提到的ColoredCircle类中,我们有一个名为testClone()的方法,它的工作原理与深度克隆完全相同。 现在我很困惑,有必要实现克隆到克隆吗?Java 即使我们可以使用下面的代码片段进行深度克隆,为什么还要实现Cloneable,java,interface,clone,cloning,cloneable,Java,Interface,Clone,Cloning,Cloneable,在上面提到的ColoredCircle类中,我们有一个名为testClone()的方法,它的工作原理与深度克隆完全相同。 现在我很困惑,有必要实现克隆到克隆吗? 上述程序是一种深度克隆吗?是否需要实现Cloneable到clone?是。clone()方法具有受保护的访问修饰符,具有以下Javadoc解释:- 此方法创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的浅拷贝,而不是深拷贝操作 您的方法testClon
上述程序是一种深度克隆吗?是否需要实现
Cloneable
到clone?是。clone()方法具有受保护的访问修饰符,具有以下Javadoc解释:-
此方法创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的浅拷贝
,而不是深拷贝
操作
您的方法testClone
虽然在克隆行为上可能是正确的,但其本身不是一个可克隆对象。可克隆对象必须实现Cloneable
接口,最好具有对clone()
的公共访问权限,以便可以在类外使用
重新阅读您的类的人很难理解
testClone()
方法的重要性。Cloneable
是一个标记接口。它不包含任何方法
问题是,clone
方法是在对象
类中定义的。由于所有类都实现了对象
类,这意味着所有类都有一个克隆
方法。但是,并非所有对象都支持它。他们中的一些人只会抛出一个CloneNotSupportedException
。但是这个克隆方法是一个本地方法,因此这个方法的确切行为在java源代码中是不可见的。因此,它缺乏一些透明度
Cloneable
界面帮助我们识别哪些类是真正可克隆的,哪些不是。按照惯例,不实现Cloneable
的类将抛出CloneNotSupportedException
注意:克隆
方法也被标记为受保护
。因此,在支持类中重写它以使其成为公共的也是惯例
JDK1中引入了
clone
设计。如今,人们普遍认为javaclone
设计存在一些缺陷。有些人喜欢只创建一个克隆构造函数(例如,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;
}
}