今日の問題を解いて理解を深めましょう。
問題
以下のコードを実行した場合、出力はどうなりますか?正しい選択肢を選んでください。
class Parent {
void display(int a) {
System.out.println("Parent: " + a);
}
}
class Child extends Parent {
void display(double a) {
System.out.println("Child: " + a);
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
obj.display(5);
}
}
選択肢
- A. Parent: 5
- B. Child: 5.0
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
A. Parent: 5
解説
基本説明:
この問題では、オーバーロードとオーバーライドの違いを理解することが重要です。
オーバーロードは同じメソッド名で引数の型や数を変えて定義する方法です。同じスコープ内で引数が異なる複数のバリエーションを持つことが可能です。
オーバーライドはスーパークラスのメソッドをサブクラスで再定義する方法で、宣言と引数リストが完全に一致する必要があります。
この設定では、Parent
クラスにはint
型の引数を受け取るdisplay()
メソッドがありますが、Child
クラスではdouble
型の引数を受け取るオーバーロードメソッドを持っています。
誤答理由:
もしBを選んだ場合の誤解は、オーバーライドの概念を誤って理解している可能性があることです。
Child
クラスはdouble
型の引数を持つ別のメソッドを定義したに過ぎず、オーバーロードでありオーバーライドではありません。
そして、CやDを選んだ場合、これはJavaのコンパイルや実行エラーの理解が不足していることを示します。
つまずきポイント:
オーバーロードとオーバーライドはJava初心者にとって混乱の原因になることが多いです。
オーバーロードでは関数名は同じですが、引数の型もしくは数が異なることによって区別されます。一方、オーバーライドでは引数やメソッドの型は完全に一致し、サブクラスがスーパークラスのメソッドを上書きしているので、実行時にはサブクラスのメソッドが呼ばれるという点を意識しましょう。
発展知識:
Javaのダイナミックメソッドディスパッチと呼ばれる仕組みにより、オーバーライドされたメソッドがサブタイプのインスタンスによって呼び出されますが、オーバーロードはメソッドがコンパイル時に決定されます。
オーバーロードはステティックバインディング、オーバーライドはダイナミックバインディング(実行時バインディング)を使用します。これらの違いをしっかり把握しておくと、Javaの多態性を正確に理解できます。