質問: "B"; @Override public void displayName() { System.out.println(this.name); System.out.println(super.name); } } ``` Mainクラス ``` public class Main { public static void main(String[] args) { B instance =new B(); System.out.println("[元の値]"); instance.displayName(); instance.name="新B"; //nameを新Bに変更 System.out.println("[新しい値]"); instance.displayName(); } } ``` これを実行した結果は、 [元の値] B A [新しい値] 新B A となります。 次にMainクラスのBのインスタンスを代入する型をAに変更します。 Mainクラス ``` public class Main { public static void main(String[] args) { A instance =new B(); //代入する型をAに変更 System.out.println("[元の値]"); instance.displayName(); instance.name="新B"; //nameを新Bに変更 System.out.println("[新しい値]"); instance.displayName(); } } ``` これを実行した結果は、 [元の値] B A [新しい値] B 新B となります。 最初にクラス型Bにインスタンスを代入した場合で値を"新B"に修正したらBが新Bに置き換わるのは理解できるのですが、 親のクラス型Aにインスタンスを代入した場合で値を"新B"に修正したらAが新Bに置き換わるのが理解できません。 「instanceが変数nameを2個持っていて、型がBの時はAのnameにアクセスできず、型がAのときはAのnameが優先されBのnameにアクセスできない」 というようなことなんでしょうか?
回答: > > 「instanceが変数nameを2個持っていて、型がBの時はAのnameにアクセスできず、型がAのときはAのnameが優先されBのnameにアクセスできない」 > > > 大体その通りです。 フィールド変数は親クラスと子クラスで同じ名前のものを持つことができるのですが、その場合、変数の型によってアクセスするフィールドが決定されます。 前半はinstanceの型がBだから、instance.nameはBクラスの持つnameを指し、 後半はinstanceの型がAだから、instance.nameはAクラスの持つnameを指します。