了解Java中的Object.clone()

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

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; } } 

由于N扩展了Objectsuper.clone()如何返回N的实例? super.clone()实际上是Object.clone() ,它返回对ObjectObject的引用。 那么我们为什么能把它投射到NN的成员num不在Object类中。 默认行为如何实际设法自动克隆此变量(因为它在类Object没有它的记录)?

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

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

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

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

 protected native Object clone() throws CloneNotSupportedException; 

JVM在内部知道当前对象的大小,以及对象的类型。 因此,它可以创建适当的对象作为按位复制并返回对它的引用。

  1. 由于N扩展了Object,super.clone()如何返回N的实例?
  2. super.clone()实际上是Object.clone(),它返回对Object类对象的引用。 那么我们为什么能把它投射到N?
  3. N的成员num不在Object类中。 怎么样
    默认行为实际上设法自动克隆此变量(因为它在类Object中没有它的记录)?

答案:

  1. 在运行时,您在N类的实例内部调用其父克隆方法。 考虑它就像你在你的N级中重写它一样完全相同。 Object类是本机和抽象对象。 实际调用N.toString()时,调用JVM在N层次结构中找到的第一个toString方法。
  2. 同样在这里,请记住你在N类的实例中。
  3. 它没有: 我如何在Java中复制对象?

您还可以使用XStream对象克隆对象,如下所示:

 public static  T cloneObject( T object) { XStream xstream = new XStream(); return (T) xstream.fromXML(xstream.toXML(object)); }