2013-09-28 35 views
1

在下面的示例代碼中,如何更改實例字段var1而不改變構造函數initialVal1var2)? - 我應該使用Arrays.copyOf進行復制嗎?Java:更改實例字段

public class Test 
{ 
private int[] var1; 
private int[] var2; 

public Test(int[] initialVal1) 
{ 
    var1 = initialVal1; 
    var2 = initialVal1; 
} 

private void int mutateVar1() 
{ 
    this.var1[0] = 100; // change the value at index 0 to 100 in var1 array, this also changes initialVal[0], right? 
} 

private int getSumOfInitial() 
{ 
    int sum = 0; 
    for (int i = 0; i < var2.length; i++) // but at this point, the initialVal[0] has also been mutated to 100. 
    { 
    sum += var2[i] 
    } 
    return sum; 
    } 
} 
+0

是的,你必須做一個數組拷貝..或者在這種情況下你可以'克隆' – nachokk

+0

由於initialVal1不在方法的範圍內,所以'getSumOfInitial'方法不會被編譯。 'initialVal1'是傳遞給構造函數的參數,一旦構造函數執行,將超出範圍 –

+0

您可以克隆或深度複製集合(數組)。 –

回答

4

var1initialVal不是數組 - 他們只是變量。它們的值指向一個數組......並且它們都指的是相同的數組。這就像有兩張紙都有相同的房屋地址。如果您使用另一張紙再次訪問該房屋,那麼您在一張紙上對該房屋進行的任何更改顯然都可見。我知道這聽起來很踏實,但根據我的經驗,當你區分變量,它們的價值觀和對象生活變得更加清晰。

如果你想要兩個獨立的數組,你需要有意識地做到這一點。例如,你可以在構造函數體更改爲:

var1 = initialVal1.clone(); 
3

是你要克隆,使兩者都指的是同array

public Test(int[] initialVal1) 
{ 
    var1 = initialVal1.clone();// or Arrays.copyOf(initialVal1,initialVal1.length); 
} 

你也有getSumOfInitial錯誤必須更換initialVal1var1

private int getSumOfInitial() 
{ 
    int sum = 0; 
    for (int i = 0; i < var1.length; i++) // but at this point, the var1[0] has also been mutated to 100. 
    { 
    sum += var1[i] 
    } 
    } 
+0

請注意'克隆();'只能在數組上安全使用 - 不要嘗試克隆數組以外的其他對象,否則會導致嚴重錯誤。 http://www.javapractices.com/topic/TopicAction.do?Id=71 – smajlo

+1

@smajlo:完全取決於類型。聲稱只能*在數組上安全地使用clone()可能會引起誤解。在很多情況下,實施起來可能很難,但是從總是這樣的情況來看,這還有很長的路要走。 –

+0

你是完全正確的,但問題的作者似乎在java中很少有經驗,所以現在對他來說最好的建議是避免使用它。 – smajlo

0

在你的構造,var1其實是另一個引用由initialVal1引用相同的數組,所以就像你說的,改變一個元素會影響另一個元素。

複製整個陣列與Arrays.copyOf()應該做的伎倆,但它是浪費。 如果內存性能是一個問題,您應該實施某種類型的寫入時複製陣列。

+0

複製寫入數組是什麼意思?你的意思是使用for循環來複制initialVal1中的每個元素?請包括一個例子。謝謝 – TonyGW

+0

不可以。寫入時複製是一種只保存已更改的值的方法,並從'initialVal1'中取出那些未保存的值。下面是一個使用'ArrayList'的實現,例如:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html – Mureinik