【问题标题】:How does clone() method in java works?java中的clone()方法是如何工作的?
【发布时间】:2013-10-13 09:41:29
【问题描述】:

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

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

【问题讨论】:

标签: java object clone


【解决方案1】:
  1. 一个方法不能同时是nativeabstract,因为native是关于一个方法的具体实现的声明;

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

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

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

    李>

【讨论】:

    【解决方案2】:

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

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

    我认为,没有必要强制转换,因为Object.clone() 保留了确切的类。如果你抓住CloneNotSupportedException,你甚至可以返回MyClass

    由于Object.clone() 是本机实现的,因此您必须查看一些 JVM 实现的源代码,例如 OpenJDK。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多