まず、以下が基のクラス A
です:
public class A {
public Number test() {
return 100;
}
}
A
クラスの test
メソッドは、戻り値の型が Number
で、引数はありません。
選択肢 A
@Override
public Integer test() {
return 0;
}
説明:
-
Number
はInteger
の親クラスなので、Integer
はNumber
にキャスト可能です。 -
@Override
アノテーションは、親クラスのメソッドを正しくオーバーライドしていることを示します。 - 引数がなく、戻り値の型が親クラスの
Number
と互換性があるので、正しいオーバーライドです。
選択肢 B
@Override
public Number test(int num) {
return num;
}
説明:
- メソッドのシグネチャ(引数の型と数)が異なります。親クラスの
test
メソッドは引数を取らないのに対し、こちらはint
型の引数を取ります。 - 引数が異なるため、これはオーバーライドではなく、新しいメソッドの定義です。
-
@Override
アノテーションがあるので、コンパイルエラーになります。
選択肢 C
@Override
public void test() {
// do something
}
説明:
- 戻り値の型が
void
で、親クラスのNumber
型とは異なります。 - 戻り値の型が異なるため、これは正しいオーバーライドではありません。
-
@Override
アノテーションがあるので、コンパイルエラーになります。
選択肢 D
public Number test() throws Exception {
return 0;
}
説明:
-
throws Exception
は、メソッドが例外をスローする可能性があることを示しますが、親クラスのtest
メソッドにはこの宣言がありません。 - オーバーライドする際に新たなチェック例外をスローすることはできません(親クラスのメソッドがその例外をスローしていない場合)。
-
@Override
アノテーションがないため、シグネチャの一致は確認されませんが、コンパイルエラーになります。
まとめ
選択肢 A は、メソッドのシグネチャ(引数の型と数、戻り値の型)が親クラスの test
メソッドと正しく一致しているため、正しいオーバーライドです。その他の選択肢(B, C, D)は、シグネチャが異なるか、戻り値の型が一致しないため、間違いとなります。
Top comments (0)