[英]If clone() value is made zero the original object value also changes to zero
我正在使用 clone() 方法復制我的 object。 但是當副本中有修改時,原來的 object 也被修改了。 我試圖在以下示例中復制我的問題。 這里有 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,其中包含main方法並使用克隆
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();
}
}
現在如何保留原來的 object 值? 我知道克隆有某些缺點。 我也嘗試過使用新的關鍵字,但沒有幫助。請建議。 在我的原始代碼中,我必須稍后使用原始 object 位值進行更多計算,並且復制的 object 位值將為 0。謝謝。
不要將bit
設置為與原始 object 相同的byte[]
,而是克隆它:
obj.bit = this.bit.clone();
此外,您不需要設置num
,因為它已經在super.clone()
返回的 object 上正確設置。
obj.setNum(this.num);
obj.setBit(this.bit);
這兩行代碼是 (a) 多余的和 (b) 錯誤的。 如果您只想要克隆中的原始字段值,則根本不需要它,因為 super.clone() 已經為您完成了。 如果您的目標是返回一個獨立值的 object。 由於 bit[] 是一個數組,即 Object,你也應該克隆它。
你沒有克隆你的bit
組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.