Javaの基本的な動作を理解するために、以下の問題に取り組んでみましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class Printer {
void printMessage() {
System.out.println("Default Message");
}
}
class CustomPrinter extends Printer {
@Override
void printMessage() {
if (true) {
System.out.println("Custom Message");
} else {
super.printMessage();
}
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new CustomPrinter();
printer.printMessage();
}
}
選択肢
- A. Default Message
- B. Custom Message
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Custom Message
解説
基本説明:
このプログラムでは、Printer
クラスを拡張するCustomPrinter
クラスが定義されています。メソッドprintMessage
がサブクラスCustomPrinter
でオーバーライドされています。
if
文の中でtrue
条件が常に評価されているため、CustomPrinter
のメッセージ「Custom Message」が出力されます。else
ブロックには到達しないため、super
を用いた親クラスのメソッドは呼び出されません。
誤答理由:
A. Default Message
が誤りである理由は、必ずtrue
となる条件が存在し、else
のブロックには流れないためです。また、 C
やD
はJava言語仕様からこのコードが正常にコンパイル、実行可能であるため誤った回答です。
つまずきポイント:
初心者が引っかかりやすい点として、true
の意味と使い方が挙げられます。if
文の条件が常にtrue
であるとき、else
ブロックは一切実行されないことを理解しておく必要があります。
発展知識:
オーバーライドの知識は多態性の根幹をなすものです。クラスが同じメソッド名を持っている際の振る舞いを理解すると、より強力なオブジェクト指向プログラミングができるようになります。また、super
を用いることによって親クラスの実装を引き継ぐことができ、子クラスで新たな機能を付加できます。