SCJP (または現在の OCPJP) 試験の準備として、(参照) 値による受け渡しと不変性に関するいくつかの模擬問題に悩まされています。
私の理解では、変数をメソッドに渡すときは、実際のオブジェクト自体ではなく、その変数に到達する方法を表すビットのコピーを渡します。
送信するコピーは同じオブジェクトを指しているため、StringBuilder に追加するなど、そのオブジェクトが変更可能な場合は変更できます。ただし、Integer をインクリメントするなど、不変オブジェクトに対して何かを行うと、ローカル参照変数は新しいオブジェクトを指すようになり、元の参照変数はこれに気付かないままになります。
ここで私の例を考えてみましょう:
public class PassByValueExperiment
{
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("hello");
doSomething(sb);
System.out.println(sb);
Integer i = 0;
System.out.println("i before method call : " + i);
doSomethingAgain(i);
System.out.println("i after method call: " + i);
}
private static void doSomethingAgain(Integer localI)
{
// Integer is immutable, so by incrementing it, localI refers to newly created object, not the existing one
localI++;
}
private static void doSomething(StringBuilder localSb)
{
// localSb is a different reference variable, but points to the same object on heap
localSb.append(" world");
}
}
質問: このように動作するのは不変オブジェクトだけで、可変オブジェクトは値渡し参照によって変更できますか? 私の理解は正しいですか、それともこの行動には他の特典がありますか?