2015-10-07 22 views
6

Eclipseに問題があります。 LogCatの値をoldListと異なるのはなぜですか?私はそれをtowコマンドの間で変更しないのですか?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]); 
     } 
    } 
} 

が、2つの結果がLogCatに異なります。

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

私はそれを2つのログ。私はちょうどlistの値を変更します。oldListではなく変更します。なぜ出力が変わるのですか?

+0

[?されているJava「により、参照渡し」または「値渡し」](http://stackoverflow.com/questions/40480/is-参照渡しによるjava-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:こんにちは、答えがあなたのために大丈夫なら、それを受け入れることができますPLZ? – kayosoufiane

+0

こんにちは、答えはOKですが、受け入れについてのあなたの平均は何ですか? – Reza

3

oldlistおよびlistは、同じ配列を指す2つの参照です。

4

listoldlistは全く同じオブジェクトを表します。あなたは

oldlist = list 

を実行すると、メモリ内のまったく同じオブジェクトを参照する二つの異なる「名前」を持っています。変数(あなたの場合は配列)を変数に代入すると、このオブジェクトはコピーされません。あなたはgoing方法でlist配列を変更するよう

したがって、あなたはlistoldlistの両方によって参照されるオブジェクトを変更しています。

+0

お返事ありがとうございます。だから私はoldListの値を保護したい場合は、私は古いリストの同様のセルにリストの各セルを割り当てる必要がありますように割り当てていない:oldList =リスト; – Reza

+1

既存の 'list'配列を代入するのではなく、コピーすることができます。詳細については、[配列Javaのコピーを作る](http://stackoverflow.com/q/5785745/421705)を参照してください。 –