このJavaのコードはガベージコレクションがいつ起きるかに関するものですね。Javaでは、オブジェクトにもうアクセスできなくなった時点でガベージコレクションによってメモリが回収される可能性があります。このコードを見てみましょう。
1. public class Main {
2. public static void main(String[] args) {
3. Object a = new Object(); // aに新しいオブジェクトを割り当てる
4. Object b = new Object(); // bに新しいオブジェクトを割り当てる
5. Object c = a; // cはaが参照するオブジェクトを参照する
6. a = null; // aの参照をnullにする(aが参照していたオブジェクトはガベージ対象に)
7. b = null; // bの参照をnullにする(bが参照していたオブジェクトはガベージ対象に)
8. // more code
9. }
10. }
2. public static void main(String[] args) {
3. Object a = new Object(); // aに新しいオブジェクトを割り当てる
4. Object b = new Object(); // bに新しいオブジェクトを割り当てる
5. Object c = a; // cはaが参照するオブジェクトを参照する
6. a = null; // aの参照をnullにする(aが参照していたオブジェクトはガベージ対象に)
7. b = null; // bの参照をnullにする(bが参照していたオブジェクトはガベージ対象に)
8. // more code
9. }
10. }
コードにコメントを付け加えた通りです。このコードによれば、行6でaが参照していたオブジェクト、行7でbが参照していたオブジェクトがガベージコレクションの対象になります。しかし、cは行5でaが参照していたオブジェクトを参照しており、行6と行7でaとbの参照がnullにされた後も、cを通じてそのオブジェクトにアクセス可能です。
問題の選択肢は以下の通りです。
A. 3行目で作成したインスタンスだけが、ガベージコレクションの対象となる
B. 4行目で作成したインスタンスだけが、ガベージコレクションの対象となる
C. 3行目と4行目で作成したインスタンスが、ガベージコレクションの対象となる
D. ガベージコレクションの対象となるインスタンスは存在しない
正しい答えはBです。これは4行目で作成されたオブジェクト(bによって参照されていたオブジェクト)が、行7でbの参照を失っているためです。他方で、3行目で作成されたオブジェクトはcによってまだ参照されているため、ガベージコレクションの対象にはなりません。