2

オブジェクトの 2 次元配列があり、それらをすべて初期化したい場合は、ループを呼び出します。

for(int i=0; i<len; i++)
    for(int j=0; j<len; j++)
        objects[i][j] = new MyObject();

これは問題なく動作しますが、for-each コンストラクトでこれを実行しようとすると、動作せず、配列全体が null のままです。

for(MyObject[] intermediate: objects)
    for(MyObject obj: intermediate)
        obj = new MyObject();

なぜ彼らは異なる振る舞いをするのですか?

4

3 に答える 3

4

課題

obj = new MyObject();

変数に新しいオブジェクトを設定するだけobjで、配列の値は変更されず、参照変数のみが変更されますobj

が に objects[i][j]assin され、実際の配列を変更せずにobjの値を変更します。obj

に直接割り当てるとobjects[i][j]、 の値を変更するため、期待どおりに機能しobjects[i][j]ます。これはまさにあなたがやりたいことです。

于 2012-04-28T10:05:36.020 に答える
3

参照は値で渡されるためobj = new MyObject();、参照のローカル コピーのみを に更新しますobjects[i][j]

于 2012-04-28T10:05:22.677 に答える