我正在使用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。 感谢。
答案 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
数组。