MENU

【Java Silver】参照型の宣言とオブジェクトライフサイクルの理解

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型の変数myBirdParrotのインスタンスを保持しています。

myBird.fly()を呼び出すと、継承元であるBirdfly()メソッドが実行され、「Flying」と出力されます。

// myBird.speak();の行がコメントアウトされているため、speakメソッドは実行されません。

もしコメントアウトを解除して呼び出そうとすると、そのspeakメソッドはBirdクラスでは利用できないため、コンパイルエラーとなります。

オブジェクトは作成された後、どこかで参照されなくなるとガベージコレクタによってメモリから解放されます。

この場合、プログラムではmainメソッドのスコープが終わるとオブジェクトはもう参照されず、最終的にシステムがメモリを解放します。

以前参照していたオブジェクトが参照解除され、他に参照がないことが確認されるとJVMのガベージコレクタがメモリを再利用する準備に入ります。

ガベージコレクションは自動で行われるため、プログラマは明示的に解放処理を書く必要はありません。

ハイレベルな言語であるJavaでは、こうしたオブジェクト管理の自動化により、メモリ管理の作業が軽減されます。

目次