我到处读到如果我在不实现Cloneable接口的情况下调用clone(),我将得到CloneNotSupportedException。如果我在没有实现Cloneable的类中实现clone方法,我仍然可以调用clone()w/o异常。我的意思是实施Cloneable没有区别。请详细说明........是否需要使用Clonable?
回答
实现Cloneable接口只是告诉程序员这个对象应该有一个有效的克隆方法。
如果你看了Cloneable接口,你会发现一个评论,看起来像这样
注意这个接口不不含有克隆 方法。因此,仅仅通过实现这个接口的事实来克隆一个对象是不可能的。即使 克隆方法是反射性调用,但不能保证它会成功。
可复制的接口只是程序员添加实现进行克隆时应该遵循的编程实践。
您的类已从Object继承受保护的方法clone()(并且它能够创建对象的浅表副本)。但是,为了在您的类的定义之外访问该方法,您需要将您的类标记为“可复制”,即实现。
在你给出的例子中,如果你创建了一个和clone()具有相同签名的方法,实现Cloneable对编译器根本无关紧要,因为他可以访问你请求的方法,所以Cloneable的实现将仅仅是经验性的。但是,我建议你坚持良好的实践方法。
“,以便获得对该方法的访问权限在您的类的定义之外,您需要将您的类标记为Cloneable“否。对您的方法的访问仅取决于您应用于方法的访问说明符。实现'Cloneable'完全与它无关。 – newacct 2013-05-04 22:28:41
如果你已经在你的类中定义了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
你可以实现一个公共'clone()'方法,而不是实现'Cloneable'。该方法将被访问,因为你已经实现了它。相反,你不能实现一个公共'clone()'方法并实现'Cloneable'。该方法不会在课堂外访问,因为您没有实现它。实现'Cloneable'是无关紧要的。 – newacct 2013-05-04 22:34:25
我到处读到如果我在不实现Cloneable接口的情况下调用clone(),我将得到CloneNotSupportedException。
正确的,如果我们在谈论Object.clone()。
如果我在一个没有实现Cloneable的类中实现clone方法,我仍然可以调用clone()w/o异常。
不,你不能,如果我们在谈论Object.clone()。
我的意思是实施Cloneable没有区别。
是的。可能你的类继承自一个已经实现了Cloneable的类。没有看到任何代码,就不可能知道你是如何抵达这种误解的。
请详细说明。
没有什么可说明的。你错了。而已。
这是一个没有实现Cloneable的类的例子,它在不抛出异常的情况下调用它。公共类克隆器公共类克隆器(){ }返回新的克隆器(); } public static void main(String [] args){ (new Cloneer())。clone(); } }' – FDinoff 2013-05-04 18:51:45
这是一个不调用Object.clone()的类的示例,因此没有为Object.clone()指定的副作用适用于它,包括NotCloneableException。我建议你阅读Javadoc。不是一个真正的问题。 – EJP 2013-05-04 19:11:57
也许你应该解释一下你认为的混乱是什么? – FDinoff 2013-05-04 19:18:01
- 1. 是否需要使用imap_close?
- 2. Ajax是否总是需要使用node.js?
- 3. 这里是否需要使用eval?
- 4. 我是否需要使用MultipleIterator的foreach?
- 5. 是否需要使用BigDecimal.new方法?
- 6. Process.Kill后是否需要使用Process.WaitForExit?
- 7. SimpleDateFormat - 您是否需要使用RegEx?
- 8. 需要说明这是否使用typedef
- 9. 是否需要在Delphi中使用GUID?
- 10. 我是否需要使用ReaderWriterLockSlim的MemoryBarrier?
- 11. 如果使用System.Threading.Timer,是否需要BackgroundWorker?
- 12. 使用Sitecore MaxMind是否需要Sitecore DMS
- 13. 是否需要在此处使用#import?
- 14. 弹簧:是否需要使用@Resource
- 15. 使用camel时,cxf:rsServer是否需要jaxrs:server?
- 16. 使用ActionController :: Live是否需要睡眠?
- 17. 是否需要在这里使用ThreadLocal?
- 18. 是否需要使用var foo = new RegExp?
- 19. 使用AddHandler时,是否需要EnterWriteLock?
- 20. 使用ARC是否NSMutableArray需要属性?
- 21. 我是否需要使用MultipleActiveResultSets feautre?
- 22. bscmake是否需要使用Visual Studio 2010?
- 23. 是否需要在onActivityResult()中使用super.onActivityResult()?
- 24. 我是否需要使用“document.getElementById”
- 25. Java是否需要使用Red5
- 26. 您是否需要使用Invoke on Action?
- 27. 我是否需要使用合成
- 28. 是否需要调用session_write_close?
- 29. 是否需要调用AsyncOperation.PostOperationCompleted?
- 30. 是否需要调用?
您可能会发现[this read](http://www.javapractices.com/topic/TopicAction.do?Id=71)有趣。 – m0skit0 2013-05-04 18:22:54
问题基于错误的前提。 – EJP 2013-05-04 18:31:05
[为了实现可克隆接口而克隆对象](http://stackoverflow.com/questions/8192223/object-cloning-with-out-implementing-cloneable-interface) – jlordo 2013-05-04 22:10:43