0

null を返すメソッドが最終的な int [] を操作している理由を誰かに説明してもらえますか?

 final int [] vals = {2,3};
 int [] vals2 = multiply(vals);

 for(int i : vals) System.out.println(i);


 int [] multiply(int [] in){
   for(int i = 0; i < in.length;i++){
      in[i] *= 2; 
   }
      return null;
 }

出力:
4
6

編集:
配列を返すメソッドでのみこの動作に気付きました。int を返す同じメソッドは、元の整数値を変更しません...

完全なコード:

public class Main{
    public Main(){
        int [] myList = {56, 32, 200};
        int [] newList = myList;
        bubble_sort(newList);

        for(int i : myList){ System.out.println(i); }
        System.out.println();
        for(int i : newList){ System.out.println(i); }
    }


    public int [] bubble_sort(int a[]){
        int n = a.length;
        int [] s = a;

        for (int i = 0; i < n ; i++){
                for (int j = n - 1; j >= (i+1); j--){
                    if (s[j - 1] > s[j]){
                        int t = s[j - 1];
                        s[j - 1] = s[j];
                        s[j] = t;
                    } 
                }
        }
        return null;
        // return s;
    }


    public static void main(String [] args){
        new Main();
    }
}

編集:
次のコードは、期待どおり次の出力を生成します: 2, 4

int vals = 2;
int vals2 = multiply(vals);
System.out.println(vals);
System.out.println(vals2);
int multiply(int in){ return in*2; }

したがって、私の質問は、int を返すメソッドが入力値を変更しないのに、配列を返すメソッドが入力の元の値を変更するのはなぜですか。

4

4 に答える 4

3

ここで、参照を初期配列の参照から変更できないことをfinal意味します。valsただし、配列の内容を変更できるかどうかについては何も述べていません。ご覧のとおり、それらは変更できます。

キーワードは、別の配列をにfinal割り当てることを止めるだけです。vals

vals = anotherArray;  // Disallowed; final

独身return null;は駄目です。multiplyメソッドは として宣言されている必要があり、void何も返されません。

于 2013-08-28T21:17:00.610 に答える
1

配列はJavaで変更可能です

「final」キーワードは、実際の値を変更するのではなく、再割り当てを停止するだけです。これは文字通り、コードのどこかに「in = someOtherArray」と記述すると、コンパイル エラーが発生することを意味します。

これにより、「final」キーワードは役に立たないように聞こえますが、プリミティブ型または不変オブジェクトに対しては期待どおりに機能します。

私が持っている場合: int i = 0; i に値を再割り当てせずに 0 を変更することはできません。

于 2013-08-28T21:17:07.943 に答える
0

メソッドが null を返していることがわかりますが、配列の内容は、multiply() メソッド内でまだ変更されています。

multiply(vals);

for(int i : vals) System.out.println(i);

乗算メソッドによって既に変更されている val を出力していることに注意してください。(Java 値渡し)

于 2013-08-28T21:30:33.797 に答える
0

したがって、文字通りこのメソッドを使用したい場合int [] newList = bubble_sort(myList);は、入力値を変更する必要はありませんが、各項目を新しい配列に保存してから、新しい
int [] s = new int[a.length]; for (int i = 0; i < n ; i++)s[i] = a[i];
配列を並べ替えて返すことができます。その後、元の配列 (myList) は影響を受けません。

于 2013-08-29T07:19:15.303 に答える