Java
1//親クラス 2public class Parent { 3 4 String name = "親"; 5}
Java
1//子クラス 2public class Child extends Parent { 3 4 String name = "子"; 5}
Java
1//孫クラス 2public class Grandchild extends Child { 3 4 String name = "孫"; 5 6 public static void main(String[] args) { 7 8 // 親、子、孫クラスの変数に同じ孫クラスのインスタンスを 9 // 代入する 10 Grandchild grandchild = new Grandchild(); 11 Child child = grandchild; 12 Parent parent = grandchild; 13 14 // 実態は同じ孫クラスインスタンスなのに 15 // それぞれの型の「name」が表示される 16 System.out.println("Grandchild:" + grandchild.name); 17 System.out.println("Child:" + child.name); 18 System.out.println("Parent:" + parent.name); 19 } 20}
実行結果
Grandchild:孫
Child:子
Parent:親
となります。実際に呼び出せるメソッド(共通するメソッド)は型に左右されず、挙動はインスタンスに従うと記憶していたのですが、この場合全ての変数の箱が同じインスタンスをさしており、かつ全ての変数の型はnameフィールドを持っているのでgrandchildを生成しこのように利用すると全てのnameの結果が'孫'になると思っておりました。
このような挙動になる理由をご教授ください。
【追記❶】
このような説明を見つけました。
オーバーライドは、その変数の型ではなくインスタンスの実態に左右される。
つまり私が質問したのはメソッドの説明であり、フィールド値は変数の型に従うという認識でしょうか。
回答3件
あなたの回答
tips
プレビュー