private メソッドはオーバーライドされない
出力はどれか。
public class Main {
public static void main(String[] args) {
System.out.println(new B().call());
}
}
class A {
private String m() { return "A"; }
String call() { return m(); }
}
class B extends A {
String m() { return "B"; }
}
- A
A - B
B - C コンパイルエラーになる
- D 実行時に例外が発生する
正解と解説を見る
正解: A
- A: private メソッドは継承されずオーバーライドもされないので、A の call() の中の m() は A の m() を呼び、A になります。
- B: B の m() は A の private m() とは無関係の別メソッドなので、call() からは呼ばれません。
- C: B に同じ名前の m() を書くのは、新しいメソッドの定義なので問題ありません。
- D: 例外になる処理はありません。
ポイント
- private メソッドはサブクラスから見えないので、オーバーライドの対象になりません。B の m は無関係な別のメソッドです。