1

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

首先,Object.clone()java 中的方法是本地方法,即它是在 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()方法的编码吗?

4

3 回答 3

3
  1. 一个方法不能native同时是一个方法,abstract因为native它是关于一个方法的特定实现的陈述;

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

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

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

于 2013-10-13T10:07:34.763 回答
0

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

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

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

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

于 2013-10-13T09:51:13.867 回答
0

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

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

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

于 2013-10-13T09:52:23.743 回答