java中的clone()方法如何工作?

时间:2013-10-13 09:41:29

标签: java object clone

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

首先,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()方法的编码吗?

3 个答案:

答案 0 :(得分:3)

  1. 方法不能同时为nativeabstract,因为native是关于方法的特定实现的声明;

  2. clone必须至少被覆盖,因为Object#cloneprotected,以防止在对象不支持克隆的情况下访问客户端;

  3. 在很多情况下clone需要做的不仅仅是Object#clone,它只是制作原始的二进制副本,相当于克隆,所有引用的对象保持不变;

  4. 在子类中捕获CloneNotSupportedException没有意义:您应该已经知道超类是否支持克隆(它不是可以在运行时更改的东西)。

答案 1 :(得分:0)

Object.clone()不是抽象的。在实现Clonable时覆盖它只是一种约定。 (Clonable是一个标记界面 - 如Serializable等。)

覆盖方法(应该)总是直接或间接调用Object.clone()

我认为,投射它是没有必要的,因为Object.clone()保留了确切的类。如果您抓住CloneNotSupportedException,您甚至可以返回MyClass

由于Object.clone()是本地实现的,您必须查看某些JVM实现的源代码,如OpenJDK。

答案 2 :(得分:0)

  

我的问题是它是否也是抽象的

不,它不是,并且Javadoc已经告诉你,对象本身不是抽象的事实,并且它'不必在我们想要克隆的类中被覆盖',除非你想要更改访问权限,这与'abstract'无关:除非它不是抽象的,否则你不能在这样的覆盖中调用'super.clone()'。

简而言之,你的问题没有多大意义。