我试图了解Object.clone()在Java中的工作方式。我遇到以下事实:
Cloneable
接口,以向Object.clone()方法指示该方法为该类的实例进行逐字段复制是合法的。Object
接口的实例上调用clone
的Cloneable
方法会导致抛出异常CloneNotSupportedException
。Cloneable
接口不包含clone
方法。因此,由于未实现Cloneable
而引发任何错误/异常,因此实现clone()
不负责。Object.clone()
是本机方法,在此cpp方法中,callsJVM_Clone
from jvm.cpp
和jvm.cpp
是CloneNotSupportedException
。问题:
Q1。
为什么Java设计人员会做出这样的设计选择并像这样实现?为什么在thrown本身中没有定义clone()
,如果实现类未提供Cloneable
的实现,则会给出编译时错误。 Q2。
为什么要在运行时检查实例是否实现clone()
? Q3。
是否有任何特定原因需要在本机代码中进行检查?Q4。
奇怪的是Cloneable
本身不实现Object
,但是提供了Cloneable
的实现,该实现反过来检查是否有实现clone()
的类实现了Cloneable
。理想情况下clone()
是否不应该实现Object
(声明Cloneable
),然后为clone()
提供实现?PS:
我知道在一个问题中问多个问题是一个坏主意。但是这些都是非常相关的问题。我可以很好地问一个问题,例如“为什么使clone()
不包含Cloneable
?”但是,我觉得,为了更好地回答这一疑问,必须涵盖这一设计决策的各个微妙方面。我付出了更多的思考,并提出了可能不同的细微方面,并明确地逐个询问了他们,以使answrer不会错过它们,并给出完整的完整答案。我试图了解Object.clone()在Java中的工作方式。我遇到了以下事实:一个类实现了Cloneable接口,以向Object.clone()方法指示它对.....>
事实是,他们希望提供clone()方法的默认实现,但是那时不存在默认方法,因此他们只有Object.clone和Cloneable接口,以表示可以对其进行克隆。因此,实际上只是它很旧。