clone()方法在java中是如何工作的?
我知道这个问题已经被问了很多次了 首先,java中的clone()方法在java中是如何工作的?,java,object,clone,Java,Object,Clone,我知道这个问题已经被问了很多次了 首先,java中的Object.clone()方法是本机方法,即它是在JVM中实现的,用户不需要知道它的实现 我的问题是这个方法是否也是抽象的。如果不是,为什么必须在要克隆的类中重写它 还有一个问题。 它被覆盖如下 public Object clone() { MyClass obj; try { obj = (MyClass)super.clone(); } catch(CloneNotSupportedExcepti
Object.clone()
方法是本机方法,即它是在JVM中实现的,用户不需要知道它的实现
我的问题是这个方法是否也是抽象的。如果不是,为什么必须在要克隆的类中重写它
还有一个问题。
它被覆盖如下
public Object clone() {
MyClass obj;
try {
obj = (MyClass)super.clone();
} catch(CloneNotSupportedException e) {
Statements
}
return obj;
}
在这段代码的第4行中,我们调用了,super.clone()
method,我们在这一行中调用了哪个clone()
method,如果Object.clone()
method为什么我们要覆盖它,我们可以在任何我们想要克隆对象的地方强制转换它
MyClass obj2 = (MyClass)obj1.clone();
他们有没有办法知道Object.clone()
方法的编码?Object.clone()
不是抽象的。在实现Clonable
时覆盖它只是一种惯例。(Clonable
是一个标记接口,类似于Serializable
等)
重写方法(应该)总是直接或间接调用Object.clone()
我认为,强制转换没有必要,因为Object.clone()
保留了确切的类。如果捕获到CloneNotSupportedException
,甚至可以返回MyClass
由于Object.clone()
是本机实现的,因此您必须查看一些JVM实现(如OpenJDK)的源代码
我的问题是它是否也是抽象的
不,它不是,Javadoc已经告诉您,对象本身不是抽象的,并且它“不必在我们想要克隆的类中被重写”,除非您想更改访问权限,这与“抽象”无关:并且您不能调用“super.clone()“在这样的覆盖中,除非它不是抽象的
简言之,你的问题没有多大意义
native
和abstract
,因为native
是关于方法具体实现的声明克隆
必须被覆盖,至少因为对象#克隆
受保护
,以防止在对象不支持克隆的情况下访问客户端克隆
需要做的不仅仅是对象#克隆
,它只是对原始对象进行二进制复制,这相当于一个浅克隆,所有引用对象保持不变CloneNotSupportedException
没有意义:您应该已经知道超类是否支持克隆(这不是运行时可以更改的)clone
是在本机语言中实现的,为什么我们需要重写此方法?