29

重複の可能性:
Javaでswapメソッドを作成することは可能ですか?

2つの値xとyが与えられた場合、それらを別の関数に渡し、それらの値を交換して結果を表示したいと思います。これはJavaで可能ですか?

4

2 に答える 2

38

プリミティブタイプ(、、、intなど)longではありませんchar。Javaは値でデータを渡します。つまり、関数が渡される変数はオリジナルのコピーであり、コピーに加えた変更はオリジナルには影響しません。

void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
    // a and b are copies of the original values.
    // The changes we made here won't be visible to the caller.
}

ここで、オブジェクトは少し異なります。オブジェクト変数の「値」は実際にはオブジェクトへの参照であり、参照をコピーすると、まったく同じオブジェクトを指すようになります。

class IntHolder { public int value = 0; }

void swap(IntHolder a, IntHolder b)
{
    // Although a and b are copies, they are copies *of a reference*.
    // That means they point at the same object as in the caller,
    // and changes made to the object will be visible in both places.
    int temp = a.value;
    a.value = b.value;
    b.value = temp;
}

制限はありますが、呼び出し元が見ることができる方法で、aまたはbそれ自体の値を変更することはできません(つまり、それらを別のオブジェクトに向けることはできません)。ただし、参照するオブジェクトの内容を入れ替えることはできます。

ところで、上記はOOPの観点からはかなり恐ろしいものです。これは単なる例です。しないでください。

于 2012-05-01T05:08:51.157 に答える
5

「値」という単語はJavaで非常に特殊な意味を持っているため、ここでは本当に煩わしくて辛辣になります。これは、特に変数がオブジェクトへの参照を保持している場合は特に、多くの人が理解できないことがよくあります。

私は質問がこの振る舞いを求めていると仮定します:

x = initialValueForX;
y = initialValueForY;
swap(x, y);
// x now holds initialValueForY;
// y now holds initialValueForX;

Javaはすべての引数を値でメソッドに渡すため、これは不可能です。xこの方法で内部に保存されている実際の値を変更することはできませんy

ただし、オブジェクトへの参照を保持している場合は、印刷された値が互いの初期値のように見えるように、2つのオブジェクトのプロパティを変更できますxy

x = initialValueForX;
y = initialValueForY;
swap(x, y);
System.out.println(x);  prints what looks like initialValueForY
System.out.println(y);  prints what looks like initialValueForX

これは、オブジェクトのIDが何であるかではなく、値の理解がオブジェクトがどのように見えるかである場合に機能します。通常、それは許容範囲です。

ここで良い例を示すつもりでしたが、cHaoはすでにそうしました。さらに、これはとにかく重複した質問であると他の人が指摘しました。

于 2012-05-01T05:09:04.683 に答える