我到处读到,如果我在没有实现 Cloneable 接口的情况下调用 clone(),我将得到 CloneNotSupportedException。如果我在一个没有实现 Cloneable 的类中实现 clone 方法,我仍然可以调用 clone() 没有异常。我的意思是实现 Cloneable 没有任何区别。请详细说明........
3 回答
实现 Cloneable 接口只是告诉程序员这个对象应该有一个有效的克隆方法。
如果您查看 Cloneable 界面,您会发现类似这样的评论
请注意,此接口不包含clone 方法。因此,不可能仅凭借实现该接口的事实来克隆对象。即使以反射方式调用 clone 方法,也不能保证它会成功。
可克隆接口只是程序员在向克隆添加实现时应该遵循的编程实践。
我到处读到,如果我在没有实现 Cloneable 接口的情况下调用 clone(),我将得到 CloneNotSupportedException。
正确,如果我们谈论的是 Object.clone()。
如果我在一个没有实现 Cloneable 的类中实现 clone 方法,我仍然可以调用 clone() 没有异常。
不,你不能,如果我们谈论的是 Object.clone()。
我的意思是实现 Cloneable 没有任何区别。
是的,它确实。可能您的类继承自已经实现 Cloneable 的类。如果没有看到任何代码,就不可能知道您是如何产生这种误解的。
请详细说明。
没有什么可详细说明的。你错了。而已。
您的类从 Object 继承了受保护的方法 clone()(并且它能够创建对象的浅表副本)。但是,为了在您的类定义之外访问该方法,您需要将您的类标记为 Cloneable,从而实现。
在您给出的示例中,如果您创建了一个与 clone() 具有相同签名的方法,那么实现 Cloneable 对编译器来说根本不重要,因为他将获得对您请求的方法的访问权限,因此实现可克隆将只是经验性的。但是,我建议您坚持良好的实践方法。