2013-05-04 108 views
0

我到处读到如果我在不实现Cloneable接口的情况下调用clone(),我将得到CloneNotSupportedException。如果我在没有实现Cloneable的类中实现clone方法,我仍然可以调用clone()w/o异常。我的意思是实施Cloneable没有区别。请详细说明........是否需要使用Clonable?

+0

您可能会发现[this read](http://www.javapractices.com/topic/TopicAction.do?Id=71)有趣。 – m0skit0 2013-05-04 18:22:54

+1

问题基于错误的前提。 – EJP 2013-05-04 18:31:05

+0

[为了实现可克隆接口而克隆对象](http://stackoverflow.com/questions/8192223/object-cloning-with-out-implementing-cloneable-interface) – jlordo 2013-05-04 22:10:43

回答

4

实现Cloneable接口只是告诉程序员这个对象应该有一个有效的克隆方法。

如果你看了Cloneable接口,你会发现一个评论,看起来像这样

注意这个接口不含有克隆 方法。因此,仅仅通过实现这个接口的事实来克隆一个对象是不可能的。即使 克隆方法是反射性调用,但不能保证它会成功。

可复制的接口只是程序员添加实现进行克隆时应该遵循的编程实践。

-2

您的类已从Object继承受保护的方法clone()(并且它能够创建对象的浅表副本)。但是,为了在您的类的定义之外访问该方法,您需要将您的类标记为“可复制”,即实现。

在你给出的例子中,如果你创建了一个和clone()具有相同签名的方法,实现Cloneable对编译器根本无关紧要,因为他可以访问你请求的方法,所以Cloneable的实现将仅仅是经验性的。但是,我建议你坚持良好的实践方法。

+0

“,以便获得对该方法的访问权限在您的类的定义之外,您需要将您的类标记为Cloneable“否。对您的方法的访问仅取决于您应用于方法的访问说明符。实现'Cloneable'完全与它无关。 – newacct 2013-05-04 22:28:41

+0

如果你已经在你的类中定义了clone(),你所说的绝对正确。但是,如果您没有实现Cloneable,您也不会覆盖该方法,您无法在外部访问它,因为它隐含地受到保护。举个例子:public class A {}。你可以从里面调用clone,但是当你有一个实例时(例如A a = new A(); a.clone() - >这将不起作用;但是public class A {public void test(){this .clone()}}将)。也许我没有解释我的意思。请原谅我生疏的英语。另外,如果我不明白你的意思,我可以进一步解释 – 2013-05-04 22:32:31

+0

你可以实现一个公共'clone()'方法,而不是实现'Cloneable'。该方法将被访问,因为你已经实现了它。相反,你不能实现一个公共'clone()'方法并实现'Cloneable'。该方法不会在课堂外访问,因为您没有实现它。实现'Cloneable'是无关紧要的。 – newacct 2013-05-04 22:34:25

3

我到处读到如果我在不实现Cloneable接口的情况下调用clone(),我将得到CloneNotSupportedException。

正确的,如果我们在谈论Object.clone()。

如果我在一个没有实现Cloneable的类中实现clone方法,我仍然可以调用clone()w/o异常。

不,你不能,如果我们在谈论Object.clone()。

我的意思是实施Cloneable没有区别。

是的。可能你的类继承自一个已经实现了Cloneable的类。没有看到任何代码,就不可能知道你是如何抵达这种误解的。

请详细说明。

没有什么可说明的。你错了。而已。

+0

这是一个没有实现Cloneable的类的例子,它在不抛出异常的情况下调用它。公共类克隆器公共类克隆器(){ }返回新的克隆器(); } public static void main(String [] args){ (new Cloneer())。clone(); } }' – FDinoff 2013-05-04 18:51:45

+0

这是一个不调用Object.clone()的类的示例,因此没有为Object.clone()指定的副作用适用于它,包括NotCloneableException。我建议你阅读Javadoc。不是一个真正的问题。 – EJP 2013-05-04 19:11:57

+0

也许你应该解释一下你认为的混乱是什么? – FDinoff 2013-05-04 19:18:01

相关问题