Java Silver試験に挑戦しましょう。今回はオブジェクトのライフサイクルに関する問題です。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class Bird {
void fly() {
System.out.println("Flying");
}
}
class Parrot extends Bird {
void speak() {
System.out.println("Talkative");
}
}
public class Main {
public static void main(String[] args) {
Bird myBird = new Parrot();
myBird.fly();
// myBird.speak(); // This line is commented
}
}
選択肢
- A. Flying
- B. Talkative
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
A. Flying
解説
解説のポイント:
- 参照型と実際のオブジェクト型
- オブジェクトのライフサイクルとガベージコレクション
この問題は、オブジェクトの参照型と実際の型の違い、そしてガベージコレクションの概念に関係しています。
まず、Bird
型の変数myBird
はParrot
のインスタンスを保持しています。
myBird.fly()
を呼び出すと、継承元であるBird
のfly()
メソッドが実行され、「Flying」と出力されます。
// myBird.speak();
の行がコメントアウトされているため、speak
メソッドは実行されません。
もしコメントアウトを解除して呼び出そうとすると、そのspeak
メソッドはBird
クラスでは利用できないため、コンパイルエラーとなります。
オブジェクトは作成された後、どこかで参照されなくなるとガベージコレクタによってメモリから解放されます。
この場合、プログラムではmain
メソッドのスコープが終わるとオブジェクトはもう参照されず、最終的にシステムがメモリを解放します。
以前参照していたオブジェクトが参照解除され、他に参照がないことが確認されるとJVMのガベージコレクタがメモリを再利用する準備に入ります。
ガベージコレクションは自動で行われるため、プログラマは明示的に解放処理を書く必要はありません。
ハイレベルな言語であるJavaでは、こうしたオブジェクト管理の自動化により、メモリ管理の作業が軽減されます。