Java 为什么Cloneable没有clone()?
我试图理解Object.clone()在Java中的工作原理。我遇到了以下事实:Java 为什么Cloneable没有clone()?,java,Java,我试图理解Object.clone()在Java中的工作原理。我遇到了以下事实: 类实现了Cloneable接口,以向Object.clone()方法指示该方法为该类实例的字段副本创建字段是合法的 在未实现Cloneable接口的实例上调用Object的clone方法会引发异常CloneNotSupportedException 但是,请注意,Cloneable接口不包含clone方法。因此,实现Cloneable不会因未实现clone()而引发任何错误/异常 相反,Object.clone(
- 类实现了
接口,以向Object.clone()方法指示该方法为该类实例的字段副本创建字段是合法的Cloneable
- 在未实现
接口的实例上调用Cloneable
的Object
方法会引发异常clone
CloneNotSupportedException
- 但是,请注意,
接口不包含Cloneable
方法。因此,实现clone
不会因未实现Cloneable
而引发任何错误/异常clone()
- 相反,
是一个本机方法,它Object.clone()
和JVM\u clone
在这个cpp方法中CloneNotSupportedException
Cloneable
本身中定义clone()
,如果实现类没有为clone()
提供实现,则会产生编译时错误
Q2.为什么要检查实例在运行时是否实现了Cloneable
Q3.是否有任何特定的理由在本机代码中检查它
Q4.奇怪的是对象本身并没有实现Cloneable
,而是提供了clone()
的实现,这反过来检查实现Cloneable
的类是否实现了clone()
。理想情况下,不应该Object
实现Cloneable
(声明clone()
),然后为clone()
提供一个实现吗
PS:我知道在一个问题中问多个问题是个坏主意。但这些都是密切相关的问题。我可以很好地问一个问题,比如“为什么Cloneable
不包含clone()
?”但是,我觉得,为了更好地回答这个疑问,必须涵盖这个设计决策的各个微妙方面。我努力想了想,想出了可能不同的微妙方面,并明确地逐点询问,这样回答者就不会错过它们,并给出一个完整的答案。问题是他们想提供clone()方法的默认实现,但默认方法当时并不存在,所以他们只有Object.clone和Cloneable接口来表示它可以被克隆。所以这真的只是因为它太旧了
正如另一位用户之前所说,clone方法是本机的,并且在接口中也不允许使用该修饰符。将Cloneable设置为抽象类不是一个选项,因为您将被迫扩展它,而无法扩展其他类,因为Java实际上没有多重继承。我不知道为什么克隆不仅适用于所有对象。简单的回答是:他们很久很久以前就做出了糟糕的设计选择,而现在我们却一直被糟糕的设计所困扰。这能回答你的问题吗?因为“modifiernative
不允许”。在接口中(…和clone
是native的…回答Q1-Q4)注意:Object.clone()
不检查Cloneable
类是否重写clone()
。它不在乎。实际上,您几乎总是需要重写该方法,以便(1)公开该方法,(2)抑制永远不会抛出的无用检查异常,(3)深度克隆任何字段。但是它不是严格要求重写它,也没有被检查。还有一个疑问是为什么对象
将clone()
声明为受保护的
?每个类都是对象的子类
,所以它对所有类都是可见的,对吗?这是另一个糟糕的设计决策吗?你所说的“Object.clone不能真正被覆盖”是什么意思?在eclipse中,当我们试图将clone()
添加到类中时,eclipse本身会向类中添加@覆盖
。@anir抱歉,我会修正我的答案。我的意思是你不能自己复制对象。