毎日の学びを深めるために、本日のChallengeをお届けします。
目次
問題
以下のコードを実行すると出力はどうなりますか?適切な選択肢を選んでください。
class Vehicle {
void start(String msg) {
System.out.println("Vehicle: " + msg);
}
}
class Car extends Vehicle {
void start() {
System.out.println("Car is starting");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myCar = new Car();
myCar.start(); // What will be the output?
}
}
選択肢
- A. Car is starting
- B. Vehicle: Car is starting
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
C. コンパイルエラー
解説
基本説明:
オーバーロードとは、同じ名前のメソッドが異なるパラメータリストを持つことです。オーバーライドは、スーパークラスのメソッドをサブクラスが同じ名前とパラメータリストで定義することです。
隠蔽(メソッド隠蔽)は、静的なメソッドをサブクラスで再定義するときに起こる問題です。静的メソッドはそもそもオーバーライドできません。
誤答理由:
選択肢AおよびBが間違っている理由は、オブジェクト型がVehicle
であり、引数なしのstart
メソッドがVehicle
には存在しないからです。そのため、コンパイルエラーが発生します。
つまずきポイント:
初心者が混同しがちなのは、オーバーロードとオーバーライドの違いです。オーバーロードは同名メソッドのパラメータ数や型が違う場合で発生し、オーバーライドはスーパークラスのメソッドの振る舞いをサブクラスで再定義することです。
発展知識:
この問題で学んだことを応用すると、メソッドのシグネチャ(名前、引数の数と型)を理解することが大切です。また、親クラスのクラス・オブジェクトが持っているメソッドを理解することで、どのクラスによるメソッドが呼び出されるかを知ることができます。