如果将clone()值设为零,则原始对象值也会更改为零

时间:2011-08-10 10:58:49

标签: java clone

我正在使用clone()方法复制我的对象。但是当副本中有修改时,原始对象也会被修改。我试图在以下示例中复制我的问题。这里有2个ClassA和ClassB类。

public class ClassB implements Cloneable
{
    int num = 0;

    byte[] bit = new byte[1];

     //Getters and setters have been removed due to space constraint

            public Object clone() 
    {
        try
        {   
          ClassB obj = (ClassB)super.clone();

          obj.setNum(this.num);
               obj.setBit(this.bit);

          return obj;
        } catch (CloneNotSupportedException e) {
                return null;              }
    }
}

//这是ClassA whioch包含main方法并使用clone

public class ClassA {

    public void cloneMethod(){

        ClassB objB = new ClassB();
        objB.bit[0] = (byte)0x8;
        objB.setNum(5);     

        ClassB objCopy = null;
        objCopy = (ClassB) objB.clone();

        if(objCopy.bit[0] != (byte)0x0)
        {
            objCopy.bit[0] = 0;
        }

        System.out.println(objB.bit[0]); //At this point the original object    value is also modified.

    }

    public static void main(String args[])
    {
        ClassA a = new ClassA();
        a.cloneMethod();
    }

}

现在如何保留原始对象值?我知道克隆有一定的缺点。我也试过新的关键词,但它没有帮助。请建议。 在我的原始代码中,我必须稍后使用原始对象位值进行更多计算,并且复制对象位值将为0。 感谢。

3 个答案:

答案 0 :(得分:1)

不要将bit设置为与原始对象相同的byte[],而是将其克隆:

obj.bit = this.bit.clone();

此外,您不需要设置num,因为已经在super.clone()返回的对象上正确设置了{{1}}。

答案 1 :(得分:1)

obj.setNum(this.num);
obj.setBit(this.bit);

这两行代码是(a)冗余和(b)错误。如果您只想要克隆中的原始字段值,则根本不需要它,因为super.clone()已经为您完成了。如果您的目标是返回一个独立估价的对象。由于bit []是一个数组,即一个Object,你也应该克隆它。

答案 2 :(得分:0)

您没有克隆bit数组。