1

コード

class Test {
    public static void main(String args[]) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        modify(a, b);
        System.out.println(a + " " + b);
    }

    public static void modify(StringBuffer a, StringBuffer b) {
        a.append(b);
        a = b;
        System.out.println(a + " " + b);
    }
}

関数内のprintステートメントを理解しています。また、クラスが文字列をインプレースで変更するため、文字列が「AB」を参照するmodifyことも知っています。StringBuffera.append(b)

String a私の質問は、関数の外側で「AB」に変更する方法ですmodifyが、ステートメントa=bは関数の外側に影響を与えませんmodify基本的に、変数が値渡しされるのはいつですか、参照渡しはいつですか?

4

3 に答える 3

2

簡単な図を次に示します。

main                            modify

StringBuffer <------a           a
     ^                          |
     +--------------------------+

StringBuffer <------b           b
     ^                          |
     +--------------------------+

では、とはmain両方とも、個別の StringBuffer インスタンスを指す参照です。を呼び出すと、参照andのコピーが渡されます (値渡し)。 は StringBuffer インスタンスの内容を変更できますが、およびの値を変更した場合、それ自体のローカル コピーに対してのみ動作し、およびが指すものには影響しません。abmainmodifyabmodifyabmainab

基本的な答えは、すべてが値によって渡されるということですが、オブジェクトを渡す場合、(値によって) 渡されるのは参照であり、オブジェクト自体ではありません。

于 2013-01-19T08:26:33.320 に答える
2

Java常に値渡しを使用します。参照の場合は、参照の値です。参照を渡すと、参照によって参照されるオブジェクトを変更することができますが、他のオブジェクトに割り当てられている参照には何の影響もありません。

したがって、あなたの場合、によって参照されるオブジェクトはa変更できますが、参照を他のオブジェクトに割り当てることはできません(そのようにすることはできますが、効果はありません)。

于 2013-01-19T08:14:00.620 に答える
0

オブジェクトを含む変数は、実際にはオブジェクトへの参照です。したがって、別の変数に割り当てると、両方の変数が同じオブジェクトを参照します。

関数に変数を渡すと、値が渡されます。

オブジェクトの場合、渡される値は参照です。

したがって、変更で b を a に割り当てることができますが、その効果は参照 b のローカル値にあり、その後は両方とも同じであり、オブジェクト b を参照します。b を a に追加すると、変数 a によって参照されるオブジェクトが変更されます。

于 2013-01-19T08:30:04.063 に答える