私はその振る舞いを知っていますが、なぜこれが起こるのか100%確信が持てません。
Javaにはインスタンス変数のポリモーフィズムがないことを理解しています。変数はコンパイラーによって静的に解決されます。
しかし、以下では私は何かについて混乱しています:
class Animal{
String name = "Animal";
public void display(){
System.out.println("My name is "+ name);
}
}
public class Dog extends Animal {
String name = "Dog";
public static void main(String[] args) {
Animal a = new Dog();
Dog d = new Dog();
System.out.println(a.name);//Line 1
a.display();//Line 2
d.display();//Line 3
}
}
(コンパイラによって解決された)の静的タイプであるため、その中Line 1
に表示されることを理解しています。
私を混乱させるのは、なぜ表示されるのかということです。これは実行時の実際のオブジェクトであり、オーバーライドされていないため、メソッドは親クラスで検出されるため、メソッドの呼び出しが試行され
ます。
私が得られないのは、操作される実際のオブジェクトがである場合に、メソッド内で親クラスのが使用される理由です。親の変数を隠しませんか?タイプが。であるため、静的に解決されているようには見えません。それはオブジェクトのメモリレイアウトの一部ではありませんか?
中のようですAnimal
a
Line 3
My name is Animal
Dog
Animal
name
display
Dog
name
Dog
display
親の変数のみが表示されます。なんで?
アップデート:
@Razvanと@LouisWassermanによる回答は役に立ちました。
これらの後に最後の質問が1つ
あります。両方のポイントは次のようです。@
Razyan
System.out.println("My name is "+ this.name); //<-- note the this
から
@Louisthis
から。Animal
the implementation of display() is in the Animal class
これまでのところ大丈夫です。しかし、これらの点は、display()
次のように変更し た場合の事実とどのように一致していますか。
class Animal{
String name = "Animal";
public void display(){
System.out.println("Current class is "+ this.getClass().getName());
System.out.println("My name is "+ name);
}
}
次に、次の結果が得られます。
Dog d = new Dog();
d.display();
現在のクラスは犬
です 私の名前は動物です
私はここで答えを理解した通りthis
の中にあるdisplay
だろうと期待していました。Animal
そうではありません。なんで?