3
public class Test {

    public static void change(char[] a){
        a[0] = '1';
        a[1] = '2';
    }

    public static void main(String args[]){
        char[] a = new char[]{'a','b'};

        change(a);

        System.out.println(a);
    }

}

出力は12です

public class Test {

    public static void change(char[] a){
        a = new char[]{'1','2'};
    }

    public static void main(String args[]){
        char[] a = new char[]{'a','b'};

        change(a);

        System.out.println(a);
    }

}

出力はabです。Javaがメソッド引数を渡す方法について何かが足りないことを理解しています。オブジェクトへの参照は値によって渡されることを理解しています。しかし、私が理解していることをこれらのプログラムの結果と一致させることはできません。

4

6 に答える 6

8

バージョン「2」では、ローカル(パラメーター)変数aであるに新しい配列を割り当てているため、changeメソッドは「何もしません」。これは、mainメソッドで宣言された変数に割り当てられた配列には影響しません。 aa

メソッドが完了すると、新しい配列はスコープ外になり、アクセスできなくなります(したがって、ガベージコレクション用に割り当てられます)change()

于 2013-02-09T01:31:04.113 に答える
4

これは、Javaが参照ではなく値を渡すためです。参照の場合は、参照をコピーします。参照の背後にある値(バージョン1)は変更できますが、参照自体(バージョン2)は変更できません。

于 2013-02-09T01:31:54.020 に答える
2

への呼び出しで

a = new char[]{'1','2'};

発生するのは、メソッドのローカル変数に新しい参照が割り当てられることだけです。これは、古い配列を参照しているメインメソッドaの変数には影響しません。a

于 2013-02-09T01:32:08.763 に答える
1

1つ目は、渡されて「a」によって参照される配列を変更することです。

2つ目は、「a」によって参照される配列を変更することです。

事実上、あなたがしている2番目のもの

char[] original = new char[]{'a','b'};
// this is basically what your function call is doing from here....
char[] a = original;      // a is now also referencing the ab array
a = new char[]{'1','2'};  // now a is referencing a 1 2 array.
// then the function returns....and original is the same still

つまり、aは新しい配列を参照していますが、元の配列はまだ元の配列を参照しています

于 2013-02-09T01:30:58.437 に答える
1

これは、データを渡す方法が原因で発生しています。最初の例では、Change()メソッドに配列のアドレスを渡し、メソッドがアドレス内のデータを変更しているため、配列が変更されます。

2番目の例では、配列は渡されますが、新しいメモリスペースを宣言し、渡されたアドレスを変更する新しい配列を初期化しています。ただし、これは、メインで宣言され初期化された元のchar[]のインスタンスを削除しません。メソッドを出力すると、作成しようとした新しい文字ではなく、ローカルの文字[]が出力されます。

于 2013-02-09T01:34:21.490 に答える
1

Javaは、参照ではなくによってメソッド間でオブジェクトを渡すためです。最初の例では、メインでオブジェクトをインスタンス化し、それをに渡します。これは、値を設定することによってのみオブジェクトを変更します。2番目の例では、メインで一度インスタンス化した後、実際に (を使用して)で再インスタンス化します。で再インスタンス化されたスコープはメソッドのみであるため、それを呼び出したmainに戻ると、ローカルで使用されているインスタンスではなく、独自のインスタンスに戻ります。changechangenewchar[]changechange

于 2013-02-09T01:38:41.097 に答える