0

メソッド内の参照を変更するとどうなりますか?

public void reverseX(int[] nums) {
    int[] nums2 = new int[nums.length] ;
    for( int i=0 ; i < nums.length ; i++ )
        nums2[i] = nums[nums.length-(i+1)] ;
    nums = nums2 ;
};

これはうまくコンパイルされます。

コードはここからのもので、してはいけないことの例として示されています。

http://www.cs.nyu.edu/~cconway/teaching/cs1007/notes/arrays.pdf

4

2 に答える 2

4

オブジェクト、参照型は不変であると想定されています。

それらのすべてではありません。全てではないがいくつか。たとえば、Stringは不変ですが、StringBuilderそうではありません。すべての配列は可変です。

nums を nums2 に設定するとどうなるか。

変数には、のnums既存の値と等しい新しい値が与えられますnums2

これらの変数が参照するオブジェクトの状態はまったく変更されません。変数値自体を変更するだけです。

変数が一枚の紙だと想像してください。整数配列は家のようなもので、変数の値は紙に書かれた住所のようなものです。この行:

nums = nums2 ;

... 紙に書かれた内容を別の紙にコピーするようなものです。住所がたまたま参照している家の内容は変わりませんよね?

これnumsは単なるローカル変数です。これはパラメーターであるためです。Java では引数は常に値渡しされるため、呼び出し元のコードはまったく変更されません。つまり、メソッドの終了直前にローカル変数の値を設定しています。それだけです。意味のある効果はありません。

これが役に立たない場合は、より具体的な質問をする必要があります。


1参照が必ずしもメモリアドレスであると言っているわけではないことに注意してください。「アドレス」という言葉は、類推において便利です。

于 2013-09-15T16:37:51.853 に答える
3

何も起こりません。参照型は値渡しなのでnums、ローカル変数です。メソッド以外には影響しません。

于 2013-09-15T16:37:34.150 に答える