今日の問題です。メソッドのオーバーロードとオーバーライドについて学んでいきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class Plant {
void grow() {
System.out.println("Plant growing");
}
}
class Flower extends Plant {
@Override
void grow() {
System.out.println("Flower blooming");
}
void grow(String season) {
System.out.println("Flower blooming in " + season);
}
}
public class Main {
public static void main(String[] args) {
Plant myPlant = new Flower();
myPlant.grow();
}
}
選択肢
- A. Plant growing
- B. Flower blooming
- C. Flower blooming in Spring
- D. コンパイルエラー
答えと解説
回答を見る
答え
B. Flower blooming
解説
基本説明:
このプログラムでは、基底クラスPlantにあるgrow
メソッドをFlowerクラスがオーバーライドしています。
また、Flowerクラスには同名で異なる引数を受け取るgrow
メソッドがオーバーロードされています。
誤答理由:
オーバーロードされたメソッドはオブジェクトの実際の型に基づきますが、この問題のケースでは、grow()
メソッドが呼ばれるためオーバーライドされたメソッドが適用されます。
そのため、PlantではなくFlowerのgrow()
メソッドが呼び出され、「Flower blooming」と出力されるのです。
つまずきポイント:
オーバーロードとオーバーライドは似ていますが、引数の異なるメソッド(オーバーロード)はコンパイル時に解決され、オーバーライドされたメソッドは実行時に解決されます。
そのため、通常、オーバーライドは”ポリモーフィズム”の一部であることを理解しておく必要があります。
発展知識:
Javaのメソッドオーバーライドは非常に強力です。ルートとなるオブジェクトの実際の型に応じて動作します。
この特性を利用することで、異なるクラス階層における一貫したメソッド呼び出しを実現できますが、コードのメンテナンスやデバッグが難しくなることもあるため、慎重に設計する必要があります。