为什么Cloneable没有clone()?

ani*_*nir 5 java

我试图了解 Object.clone() 在 Java 中是如何工作的。我发现了以下事实:

  • 类实现该Cloneable接口以向 Object.clone() 方法指示该方法对该类的实例进行逐字段复制是合法的。
  • 在未实现该接口的实例上调用 的Object方法会导致抛出异常。cloneCloneableCloneNotSupportedException
  • 但请注意,该Cloneable接口不包含该clone方法。因此,实现Cloneable不负责因未实现而引发任何错误/异常clone()
  • 相反,Object.clone()是一个本机方法,它从此cpp方法中调用 并抛出。JVM_Clone jvm.cppCloneNotSupportedException

疑点:

Q1. 为什么Java设计者会做出这样的设计选择并这样实现呢?为什么不在其自身clone()中进行定义Cloneable,如果实现类没有提供clone().

Q2。Cloneable为什么要在运行时检查实例是否实现?

Q3。有什么具体原因要在本机代码中检查它吗?

Q4。奇怪的是Object它本身并没有实现Cloneable,但提供了一个实现clone(),它反过来检查是否有任何类实现了Cloneable实现clone()。理想情况下,不应该Object实现Cloneable(声明clone())然后提供实现吗clone()

PS:我知道在一个问题中提出多个问题是一个坏主意。但这些都是密切相关的问题。我很可能会问一个问题,比如“为什么不Cloneable包含clone()?” 但是,我觉得,为了更好地回答这个疑问,必须涵盖这一设计决策的各个微妙方面。我努力思考更多,并提出了可能的不同微妙方面,并逐点明确地询问它们,以便回答者不会错过它们并给出总体完整的答案。

use*_*ser 6

问题是,他们想要提供 clone() 方法的默认实现,但当时不存在默认方法,因此他们只有 Object.clone 和 Cloneable 接口来表示它可以被克隆。所以这真的只是它老了。

正如另一位用户之前所说,克隆方法是本机方法,并且接口中也不允许使用该修饰符。将 Cloneable 设为抽象类不是一个选项,因为您将被迫扩展它并且无法扩展其他类,因为 Java 并不真正具有多重继承。我不知道为什么不仅仅所有对象都支持克隆。