我知道这个问题被问了很多次。
首先,java中的Object.clone()
方法是本机方法,即它是在JVM中实现的,用户不需要知道它的实现。
我的问题是这种方法是否也是抽象的。如果不是,为什么必须在我们想要克隆的类中重写它。
还有一个问题。 它被覆盖如下
public Object clone() {
MyClass obj;
try {
obj = (MyClass)super.clone();
} catch(CloneNotSupportedException e) {
Statements
}
return obj;
}
在此代码的第4行,我们调用了super.clone()
方法,我们在此行中调用clone()
方法,如果Object.clone()
方法为什么我们覆盖它,我们可以简单地将它转换为我们想要克隆对象的地方
MyClass obj2 = (MyClass)obj1.clone();
并且他们可以通过任何方式了解Object.clone()
方法的编码吗?
答案 0 :(得分:3)
方法不能同时为native
和abstract
,因为native
是关于方法的特定实现的声明;
clone
必须至少被覆盖,因为Object#clone
是protected
,以防止在对象不支持克隆的情况下访问客户端;
在很多情况下clone
需要做的不仅仅是Object#clone
,它只是制作原始的二进制副本,相当于浅克隆,所有引用的对象保持不变;
在子类中捕获CloneNotSupportedException
没有意义:您应该已经知道超类是否支持克隆(它不是可以在运行时更改的东西)。
答案 1 :(得分:0)
Object.clone()
不是抽象的。在实现Clonable
时覆盖它只是一种约定。 (Clonable
是一个标记界面 - 如Serializable
等。)
覆盖方法(应该)总是直接或间接调用Object.clone()
。
我认为,投射它是没有必要的,因为Object.clone()
保留了确切的类。如果您抓住CloneNotSupportedException
,您甚至可以返回MyClass
。
由于Object.clone()
是本地实现的,您必须查看某些JVM实现的源代码,如OpenJDK。
答案 2 :(得分:0)
我的问题是它是否也是抽象的
不,它不是,并且Javadoc已经告诉你,对象本身不是抽象的事实,并且它'不必在我们想要克隆的类中被覆盖',除非你想要更改访问权限,这与'abstract'无关:除非它不是抽象的,否则你不能在这样的覆盖中调用'super.clone()'。
简而言之,你的问题没有多大意义。