3

我知道使用这种克隆机制不是一个好主意(因为它像一些作者所说的那样被“破坏”了),尽管我需要帮助来理解它是如何工作的。我们得到以下类层次结构:

class N implements Cloneable{
    protected int num;
    public N clone() throws CloneNotSupportedException{
        return (N)super.clone();
    }
}

class M extends N{
    protected String str;
    public M clone() throws CloneNotSupportedException{
        M obj = (M)super.clone();
        obj.setString(new String(this.str));
        return obj;
    }
    void setString(String str){
        this.str = str;
    }
}

既然Nextends Object,怎么super.clone()返回一个实例N呢?super.clone()实际上Object.clone()是返回对 class 对象的引用Object。为什么我们能够将其转换为NN有一个num不在类中的成员Object。默认行为实际上如何设法自动克隆此变量(因为它在 class 中没有记录Object)?

此外,M 也是如此。M.clone()我们将一个对象从 class N(由 返回super.clone())转换为 class 的对象M。我知道所有这些都是有效的,但我不明白为什么。

4

4 回答 4

6

Object#clone是一种本机方法,它生成对象的低级二进制副本,从而生成同一类的另一个实例。因此,垂头丧气是安全的。

请注意,这是拥有多态克隆方法的唯一方法。

于 2013-05-22T09:43:03.457 回答
2

从技术上讲,Object.clone()是一种本机方法:

protected native Object clone() throws CloneNotSupportedException;

而且JVM内部知道当前对象有多大,对象的类型是什么。因此,它可以将适当的对象创建为按位副本并返回对它的引用。

于 2013-05-22T09:43:45.550 回答
0

You can also use the XStream object to clone your objects, like this :

public static <T> T cloneObject(
    T object) {
    XStream xstream = new XStream();
    return (T) xstream.fromXML(xstream.toXML(object));
  }
于 2013-05-22T10:11:06.513 回答
0
  1. 既然 N 扩展了 Object,那么 super.clone() 是如何返回 N 的实例的呢?
  2. super.clone() 实际上是 Object.clone(),它返回对 Object 类对象的引用。为什么我们能够将其转换为 N?
  3. N 有一个不在类 Object 中的成员 num。默认行为实际上是如何
    设法自动克隆这个变量的(因为它在 Object 类中没有它的记录)?

答案:

  1. 在运行时,您在 N 类的实例中调用其父克隆方法。将其视为与您在 N 类中覆盖它完全相同的事情。Object 类是一个原生的抽象对象。实际上,当您调用 N.toString() 时,您调用了 JVM 在 N 的层次结构中找到的第一个 toString 方法。
  2. 同样在这里,请记住您在 N 类的实例中。
  3. 它没有:如何在 Java 中复制对象?
于 2013-05-22T09:54:29.527 回答