clone()方法在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

我知道这个问题已经被问了很多次了

首先,java中的
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
    是在本机语言中实现的,为什么我们需要重写此方法?