2010-04-25 125 views
4

我已經知道,淺拷貝是什麼,但我不能提示它。這是一個簡短的例子。Java中的淺拷貝

public class Shallow { 
String name; 
int number; 

public Shallow (Shallow s) { 
    this.name = s.name; 
    this.number = s.number; 
} 
} 

測試執行...

public class ShallowTest { 
public static void main (String[] args) { 
    Shallow shallow = new Shallow("Shallow", 123); 
Shallow shallowClone = new Shallow(shallow); 
    shallowClone.name = 'Peter'; 
    shallowClone.number = 321; 
    System.out.println(shallow.name + " - " + shallow.number); 
} 
} 

正如我的目的,非原始數據類型爲String的只是引用的將被複制,因此通過調用「shallowClone.name =‘彼得’; 「我也會改變「淺」的名字。我對嗎?但不知何故,它只是不想工作....

+0

'新的淺(淺)'構造函數代碼是怎麼樣的?你沒有把它包括在問題中,而問題可能在那裏引起。值得注意的是字符串是不可變的。 – BalusC 2010-04-25 18:08:20

+0

剛剛編輯了構造函數。 此外:我其實喜歡只是複製對象的引用 - 這是目標;) – Vilius 2010-04-25 18:13:45

回答

5

字符串和整數是不可變的。修改您的數據結構以使用保存引用的可變結構,例如數組或集合。例如。

public class Shallow { 
    private Object[] properties = new Object[2]; 

    public Shallow(String name, int number) { 
     this.properties[0] = name; 
     this.properties[1] = number; 
    } 

    public Shallow(Shallow s) { 
     this.properties = s.properties; 
    } 

    public String getName() { 
     return (String) properties[0]; 
    } 

    public void setName(String name) { 
     this.properties[0] = name; 
    } 

    public int getNumber() { 
     return (Integer) properties[1]; 
    } 

    public void setNumber(int number) { 
     this.properties[1] = number; 
    } 
} 

並使用getters/setters而不是直接訪問屬性。

Shallow shallow = new Shallow("Shallow", 123); 
Shallow shallowClone = new Shallow(shallow); 
shallowClone.setName("Peter"); 
shallowClone.setNumber(321); 
System.out.println(shallow.getName() + " - " + shallow.getNumber()); // Peter - 321 

另請注意,字符串通常用雙引號引起來。在將來,從您的編輯器複製實際的,可編譯的和可操作的代碼,而不是從頭開始或從頭開始輸入它。避免紅鯡魚。

+0

好吧,好的。我想我已經明白了!非常感謝你:) – Vilius 2010-04-25 18:26:49

+0

不客氣。 – BalusC 2010-04-25 18:29:51