アクセスを狭めるオーバーライド
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
new B().m();
}
}
class A {
public void m() { System.out.println("A"); }
}
class B extends A {
void m() { System.out.println("B"); }
}
- A
Bと出力される - B
Aと出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: D
- A: オーバーライドでアクセス修飾子を狭められないので、コンパイルエラーです。実行まで進まないので、何も出力されません。
- B: 実行まで進まないので、何も出力されません。
- C: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- D: 親の public m() を、子でパッケージアクセス (修飾子なし) に狭めてオーバーライドしているので、コンパイルエラーになります。
ポイント
- オーバーライドでアクセス修飾子を親より狭くすることはできません。広くするのは OK です。