使用Object类的clone()方法克隆对象

时间:2019-08-26 18:06:58

标签: java

如果要克隆的对象的类包含非原始数据类型(如另一个类的对象),那么在此对象中所做的更改会同时反映在两个对象中(即原始对象和克隆对象)?虽然对原始数据类型所做的更改仅反映在克隆对象中,为什么?

move dir1\*.jpg dir2\...

1 个答案:

答案 0 :(得分:3)

Java clone()方法仅创建一个浅拷贝,这意味着将复制原始数据类型字段的值,但复制对象类型字段的引用。在您的示例中,这导致两个对象“共享”一个Best对象。

要完成深层复制,在其中创建一个新对象而不是引用现有对象,则需要在覆盖的clone()方法中创建一个新的Best对象,然后分配值手动或使Best可克隆。我更喜欢使Best可克隆,因为更改Best类的字段不需要更改Test类的clone()方法。尝试以这种方式创建深层副本时,最重要的事情是必须始终克隆下来,直到仅到达原始数据字段为止,这并不总是合理/可行的。如果是这种情况,只需手动分配值即可。

实现最佳克隆:

class Best implements Cloneable
{
    int x;
    int y;
    public Object clone() throws CloneNotSupportedException
    {
        return super.clone();   
    }
}

class Test implements Cloneable
{
    int a;
    int b;
    Best bt = new Best();

    public Object clone()throws CloneNotSupportedException
    {
        Test t = (Test) super.clone();
        t.bt = (Best) this.bt.clone();
        return t;   
    }
}

手动分配值:

class Best
{
    int x;
    int y;
}

class Test implements Cloneable
{
    int a;
    int b;
    Best bt = new Best();

    public Object clone()throws CloneNotSupportedException
    {
        Test t = (Test) super.clone();
        t.bt.x = this.bt.x;
        t.bt.y = this.bt.y;
        return t;   
    }
}