我试图了解 Object.clone() 在 Java 中是如何工作的。我发现了以下事实:
- 一个类实现了
Cloneable
接口,向 Object.clone() 方法指示该方法对该类的实例进行逐字段复制是合法的。
- 调用
Object
's clone
未实现的实例上的方法Cloneable
接口导致异常CloneNotSupportedException
被抛出。
- 但请注意,
Cloneable
接口不包含clone
方法。因此,实施Cloneable
不负责因未实施而引发任何错误/异常clone()
.
- 反而,
Object.clone()
是一个本机方法,其中calls https://github.com/bpupadhyaya/openjdk-8/blob/45af329463a45955ea2759b89cb0ebfe40570c3f/jdk/src/share/native/java/lang/Object.c#L47 JVM_Clone
from jvm.cpp https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/prims/jvm.cpp#L545 and CloneNotSupportedException
is thrown https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/prims/jvm.cpp#L566在这个cpp方法中。
Doubts:
Q1.为什么Java设计者会做出这样的设计选择并这样实现呢?为什么没有clone()
定义于Cloneable
如果实现类没有提供实现,它本身会给出编译时错误clone()
.
Q2.为什么要检查实例是否实现Cloneable
在运行时?
Q3.有什么具体原因要在本机代码中检查它吗?
Q4.奇怪的是Object
本身并没有实现Cloneable
,但提供了一个实现clone()
,这又检查是否有任何类实现Cloneable
实施clone()
或不。理想情况下不应该Object
实施Cloneable
(声明clone()
),然后提供一个实现clone()
?
PS:我知道在一个问题中提出多个问题是一个坏主意。但这些都是密切相关的问题。我很可能会问一个问题,比如“为什么Cloneable
不含clone()
但是,我觉得,为了更好地回答这个疑问,必须涵盖这一设计决策的各个微妙方面。我努力思考更多,并提出了可能的不同微妙方面,并逐点明确地询问它们,以便回答者不会错过它们并将给出总体完整的答案。
问题是,他们想要提供 clone() 方法的默认实现,但当时不存在默认方法,因此他们只有 Object.clone 和 Cloneable 接口来表示它可以被克隆。所以这真的只是它老了。
正如另一位用户之前所说,克隆方法是本机方法,并且接口中也不允许使用该修饰符。将 Cloneable 设为抽象类不是一个选项,因为您将被迫扩展它并且无法扩展其他类,因为 Java 并不真正具有多重继承。我不知道为什么不仅仅所有对象都支持克隆。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)