フィールドは変数の型で決まる
出力はどれか。
public class Main {
public static void main(String[] args) {
A x = new B();
B y = (B) x;
System.out.println(x.name + " " + y.name + " " + x.get());
}
}
class A {
String name = "A";
String get() { return name; }
}
class B extends A {
String name = "B";
String get() { return name; }
}
- A
A B B - B
B B B - C
A B A - D
A A B
正解と解説を見る
正解: A
- A: フィールドは変数の型で決まり (x.name は A、y.name は B)、メソッドは実体の型で決まる (x.get() は B の get()) ので A B B です。
- B: フィールドはオーバーライドされません。x の型は A なので、x.name は A の name ("A") です。
- C: x.get() は実体が B なので B の get() が呼ばれ、B の name ("B") を返します。
- D: y の型は B なので、y.name は B の name ("B") です。
ポイント
- フィールドはオーバーライドされず、変数の型 のものが使われます。x は A 型なので "A"、y は B 型なので "B" です。
- メソッドは実体 (B) のものが呼ばれ、その中の name は B のフィールドです。
「参照型のキャストとポリモーフィックなメソッド呼び出し」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)