SCJP 6 準備本から抜粋 -
与えられた:
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
// do Stuff
}
}
// doStuff に達したとき、GC の対象となるオブジェクトの数は?
A.0
B.1
C.2
D. コンパイルが失敗する
E.知ることができない
F. 実行時に例外がスローされる
正解は C です。「1 つの CardBoard オブジェクト (c1) のみが適格ですが、関連する Short ラッパー オブジェクトも適格です。」
私の質問は、c3 がコレクションの対象にならないのはなぜですか?
私の考えは -
c1.go(c2) は、ローカル参照変数 cb (c2 のコピー) を null に設定し、c3 に割り当てられた cb を返します。メソッド内で c2 自体の参照変数を変更することはできず、その背後にあるオブジェクトのみを変更できることはわかっています。ただし、参照変数 cb のコピーが null に設定され、c3 に割り当てられているように見えます。このインスタンスで c3 が返された null に設定されないのはなぜですか?