今回も問題を解いていきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
interface Flyer {
void fly();
}
class Bird implements Flyer {
public void fly() {
System.out.println("Bird is flying");
}
}
class Superhero extends Bird {
void fly() {
System.out.println("Superhero flies high");
}
}
public class Main {
public static void main(String[] args) {
Flyer flyer = new Superhero();
flyer.fly();
}
}
選択肢
- A. Bird is flying
- B. Superhero flies high
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Superhero flies high
解説
基本説明:
この問題は、Javaのインタフェースと継承の動作に関する理解を問うものです。Javaには「ポリモーフィズム」という概念があり、「同じ型でも中身を見て動作を決定する」特性があります。
ここでは`Flyer`というインタフェースを`Bird`と`Superhero`が実装しています。そして`Superhero`は`Bird`を継承しています。`Flyer flyer = new Superhero();`というコードで作成された`flyer`インスタンスは`Superhero`の実インスタンスです。
このように、オーバーライドされた`Superhero`の`fly()`メソッドが実行され、「Superhero flies high」と出力されます。
誤答理由:
選択肢A「Bird is flying」を選んだ場合、`Flyer`型の変数が実際には`Superhero`オブジェクトを指しています。このため`Superhero`の`fly()`メソッドが呼び出されます。
ポリモーフィズムを知らなかったり、メソッドが正しくオーバーライドされていることに気づかなかったりするとこの誤答が多くなります。
つまずきポイント:
初心者の方は、インタフェースを実装したクラスがさらに他のクラスを継承している時の動作に戸惑いを感じることが多いです。
メソッドのオーバーライドは、クラスの継承とインタフェースの実装が重なることで複雑に見えてしまいますが、実際にはオブジェクトの実際の型に依存していることを理解すると容易に解決できます。
発展知識:
Javaにおけるポリモーフィズムは、非常にパワフルな機能です。このため、正しく理解することでコードの拡張性が大きく向上します。インタフェースとクラスを組み合わせて設計することで、柔軟なプログラム設計が可能になります。
また、ランタイム時の動作をしっかりと理解しておくことで、より複雑なシステムの構築にも対応できる力を身につけましょう。