簡體   English   中英

如果將 clone() 值設為零,則原始 object 值也將更改為零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM