我试图了解Object.clone()是如何在Java中工作的。我发现了以下事实:
Cloneable接口,以向Object.clone()方法表明该方法对该类实例的字段对字段副本是合法的。Object接口的实例上调用Cloneable的clone方法将导致抛出异常CloneNotSupportedException。Cloneable接口不包含clone方法。因此,实现Cloneable不负责为不实现clone()而引发任何错误/异常。Object.clone()是本机方法,在此cpp方法中,呼叫 JVM_Clone jvm.cpp和CloneNotSupportedException是抛出。怀疑:
Q1.为什么Q1设计人员做出这种设计选择并像这样实现它呢?为什么不在clone()本身中定义Cloneable,如果实现类没有为clone()提供实现,这将导致编译时错误。
Q2.为什么要检查实例是否在运行时实现Cloneable?
Q3.有什么特定的理由在本机代码中检查它吗?
Q4.奇怪的是,Object本身没有实现Cloneable,但是提供了clone()的实现,这反过来检查是否有实现Cloneable的类实现clone()。Object不应该理想地实现Cloneable (声明clone()),然后为clone()提供一个实现
PS:,我知道在一个问题中问多个问题是个坏主意。但这些都是密切相关的问题。我可以问一个简单的问题,比如“为什么Cloneable不包含clone()?”但是,我觉得,为了更好地回答这个疑问,我们必须涵盖这个设计决策的各种微妙的方面。我努力想得更多,想出可能的不同微妙的方面,并明确地问他们点态,这样回答者就不会错过他们,并且会给出一个完整的答案。
发布于 2020-03-18 18:58:46
问题是,他们希望提供克隆()方法的默认实现,但当时不存在默认方法,因此他们只有Object.clone和Cloneable接口来表示可以克隆它。所以这只是因为它很古老。
正如另一位用户之前所说的,克隆方法是原生的,接口中也不允许使用该修饰符。使Cloneable成为抽象类不是一种选择,因为您将被迫扩展它,并且无法扩展其他类,因为Java实际上并不具有多重继承。为什么克隆不只是支持所有的对象,我不知道。
https://stackoverflow.com/questions/60745648
复制相似问题