2013-05-22 36 views
3

我知道使用这种克隆机制并不是一个好主意(因为它像某些作者所说的那样“破碎”),尽管我需要帮助了解它是如何工作的。我们给出的类层次结构:了解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延伸Object,请问super.clone()返回N一个实例? super.clone()实际上是Object.clone(),它返回对类Object的对象的引用。为什么我们可以将它投射到NN的成员num不属于类Object。默认行为是如何实际设法自动克隆这个变量的(因为它在类Object中没有记录)?

此外,同样适用于M.在M.clone()我们从铸造类N(由super.clone()返回)的目的是M类的一个对象。我知道所有这些都是有效的,但我不明白为什么。

+0

的可能重复【JAVA:克隆()操作调用超。克隆()](http://stackoverflow.com/questions/5430944/java-clone-operation-calling-super-clone) – EJP

回答

6

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

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

2

技术上,Object.clone()是一个本地方法:

protected native Object clone() throws CloneNotSupportedException; 

和JVM内部知道当前对象有多大,什么对象的类型。因此,它可以创建适当的对象作为逐位拷贝并返回对其的引用。

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()时,实际上你会调用J的第一个toString方法在N的层次结构中找到。
  2. 同样在这里,请记住你是在N类的一个实例。
  3. 它并不:How do I copy an object in Java?
0

您还可以使用的XStream对象克隆你的对象,像这样:

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