オブジェクトのライフサイクルに関する問題を解いてみましょう。
問題
次のJavaプログラムの実行結果として正しいものを選んでください。プログラムの各行が何をしているかを意識して解いてみてください。
class Example {
private String value;
Example(String value) {
this.value = value;
}
String getValue() {
return this.value;
}
}
public class Main {
public static void main(String[] args) {
Example example1 = new Example("First");
Example example2 = new Example("Second");
example1 = example2;
example2 = null;
System.out.println(example1.getValue());
}
}
選択肢
- A. First
- B. Second
- C. null
- D. コンパイルエラー
答えと解説
回答を見る
答え
B. Second
解説
解説のポイント:
- 参照の再割り当て
- ガベージコレクションとオブジェクトのライフサイクル
このプログラムで重要なのは、example1
とexample2
が管理するオブジェクトのライフサイクルです。
1. 初期状態でexample1
が指すのは値「First」を持つExample
オブジェクトで、example2
は値「Second」を持つオブジェクトです。
2. 行example1 = example2;
では、example1
が今度はexample2
と同じ「Second」のオブジェクトを指すことになります。それによって、「First」のオブジェクトはどこからも参照されない状態になります。
3. 次のexample2 = null;
は、example2
の参照を解除するだけなので、依然としてexample1
は「Second」のオブジェクトを参照し続けています。
4. 結果として、example1.getValue()
を実行すると「Second」が出力されます。
つまずきポイント
初学者の多くが混乱するポイントは、新しい参照を設定したときに古いオブジェクトが自動的に消滅するかどうかです。
参照を解除してもオブジェクト自体が即座に削除されるわけではなく、Javaのガベージコレクションが行われるタイミングまでメモリ内に残る可能性があります。
発展知識
Javaでは、参照がなくなったオブジェクトが自動的にメモリから削除されるため、意識してメモリ管理を行う必要がありません。これは「ガベージコレクション」と呼ばれる機能で、プログラマの負担を減らす重要な仕組みです。
ガベージコレクションはバックグラウンドで起こるので、タイミングを明確に制御することはできません。しかし、System.gc()メソッドでガベージコレクタを手動で呼び出すことが一応可能です。
ただし、これはあくまで「推奨」するもので、全てのJava仮想マシンがこの呼び出しに対する反応を保証しているわけではありません。