class Parent {
static String kind() { return "Parent"; }
String name() { return "parent"; }
}
class Child extends Parent {
static String kind() { return "Child"; }
String name() { return "child"; }
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.kind() + ":" + p.name());
}
}
選択肢
- あなたの回答
- 正解
正解
C. Parent:child
詳細解説
static メソッドはオーバーライドでなく隠蔽(hiding)で、参照型のクラスで解決されます。p の宣言型は Parent なので kind() は Parent のものが呼ばれます。一方 name() はインスタンスメソッドなので実体の型 Child で解決され child が返ります。
なぜ他の選択肢が違うのか
- static メソッドは実体の型ではなく参照型で解決されるため Child にはなりません。
- インスタンスメソッド name() はオーバーライドが働くため parent にはなりません。
- static は実体の型ではなく参照型で解決されます。
罠ポイント
static メソッドとインスタンスメソッドでは解決されるタイミングがコンパイル時と実行時で異なります。