static メソッドは隠蔽
出力はどれか。
public class Main {
public static void main(String[] args) {
A x = new B();
System.out.println(x.m());
}
}
class A {
static String m() { return "A"; }
}
class B extends A {
static String m() { return "B"; }
}
- A
A - B
B - C コンパイルエラーになる
- D
AB
正解と解説を見る
正解: A
- A: static メソッドはオーバーライドされず (隠ぺい)、変数の型 A で決まるので、A の m() が呼ばれます。
- B: static メソッドは実際のオブジェクトの型ではなく、変数の型で選ばれるので B にはなりません。
- C: 子クラスで同じシグネチャの static メソッドを書くこと (隠ぺい) はできます。static メソッドは変数経由でも呼び出せます (おすすめはクラス名経由)。
- D: m() は1回しか呼ばれていないので、AB にはなりません。
ポイント
- static メソッドはオーバーライドされず (隠蔽)、変数の型で呼ばれるメソッドが決まります。