2015-10-07 70 views
6

我在Eclipse中遇到問題。爲什麼LogCat中oldList的值不同,而我在兩個Log命令之間沒有更改它的值?java中的變量不正確

首先我有一個initialize方法:

private void initialize() { 

    list[0][0] = 2; 
    list[0][1] = 4; 
    list[1][0] = 3; 
    list[1][1] = 7; 

    oldList = list; 

    going(); 
} 

並在going方法,我印刷oldList兩次:

private void going() { 

    for (int i = 0; i < 2; i++) { 
     for (int j = 0; j < 2; j++) { 
      Log.i("Log", "oldList = " + oldList[i][j]); 
     } 
    } 
    Log.i("Log", "---------------------------"); 

    // ---------------------------------------------------- 
    list[0][0] = 0; 
    list[0][1] = 5; 

    list[1][0] = 0; 
    list[1][1] = 0; 
    // ---------------------------------------------------- 

    for (int i = 0; i < 2; i++) { 
     for (int j = 0; j < 2; j++) { 
      Log.i("Log", "oldList = " + oldList[i][j]); 
     } 
    } 
} 

但兩個結果是在logcat的不同:

oldList = 2 
oldList = 4 
oldList = 3 
oldList = 7 
--------------------------- 
oldList = 0 
oldList = 5 
oldList = 0 
oldList = 0 

雖然我不改變它之間的兩個日誌。我只是改變了list的值,而不是oldList。爲什麼輸出會改變?

+0

[?就是Java「傳址參考」或「傳遞的價值」(http://stackoverflow.com/questions/40480/is- java-pass-by-reference-or-pass-by-value) – zapl

回答

1

你可以試試這個:

private void initialize() { 
    list[0][0] = 2; 
    list[0][1] = 4; 
    list[1][0] = 3; 
    list[1][1] = 7; 

    // simply 
    oldList[0] = list[0].clone(); 
    oldList[1] = list[1].clone(); 

    // or in a greater 2D arrays 
    for (int i = 0; i < list.length; i++) { 
     System.arraycopy(list[i], 0, oldList[i], 0, list[0].length); 
    } 

    going(); 
} 
+0

非常感謝,它的工作原理。 – Reza

+0

@Reza:你好,如果答案對你沒問題,你能接受嗎? – kayosoufiane

+0

你好,回答是好的,但你接受的意思是什麼? – Reza

3

oldlistlist是指向相同數組的兩個引用。

4

listoldlist都指向完全相同的對象。當您運行

oldlist = list 

你有兩個不同的「名字」,指在內存完全相同的對象。當你將一個對象(在你的情況下是數組)賦給一個變量時,這個對象將不會被複制。

因此,如在你going方法改變list陣列,要更改由兩個listoldlist引用的對象。

+0

非常感謝您的回答。所以如果我想保護oldList的值,我必須將列表的每個單元格分配給oldList中的相似單元格,而不是像以下那樣分配:oldList = list; – Reza

+1

您可以複製現有的'list'數組,而不是隻分配它。有關詳細信息,請參見[製作陣列Java的副本](http://stackoverflow.com/q/5785745/421705)。 –