成员变量的多态性.我知道这是不可能的,我不明白这个具体案例

Cra*_*lus 11 java oop polymorphism overriding class

我知道这种行为,但我不确定为什么会这样.
据我所知,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  
   }  
}  
Run Code Online (Sandbox Code Playgroud)

我认为Line 1它会显示Animal为静态类型a(由编译器解析).
让我困惑的是为什么Line 3还要展示My name is Animal
将尝试调用该方法,Dog因为这是运行时的实际对象,因为它不会被覆盖,所以可以在父类中找到该方法Animal.
我没有得到的是为什么在操作的实际对象是a时,name在方法内部使用父类.它不隐藏父变量吗?在我看来它并不是因为类型是静态解析的.这不是oject的内存布局的一部分吗? 就像里面只有父的变量是可见的.为什么? displayDognameDog
display

更新:

@ Razvan和@LouisWasserman的答案很有帮助.
在这之后我还有最后一个问题:
两者的要点似乎如下:
来自@Razyan
System.out.println("My name is "+ this.name); //<-- note the this
来自@Louis
this指的是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);  
   }  
}  
Run Code Online (Sandbox Code Playgroud)

然后结果:

 Dog d = new Dog();  
 d.display();  
Run Code Online (Sandbox Code Playgroud)

目前的班级是
我的名字是动物

我期待那this里面display会是Animal因为我理解这里的答案.但事实并非如此.为什么?

Raz*_*van 13

当你调用d.display()Animal.display()是所谓的,因为你没有在狗类中重写它.

所以假想的实现Dog.display()将是这样的:

 public void display(){  
    super.display();
 }
Run Code Online (Sandbox Code Playgroud)

Animal.display()的实现是:

 public void display(){  
    System.out.println("My name is "+ this.name); //<-- note the this
 } 
Run Code Online (Sandbox Code Playgroud)

Animal.display()方法甚至不知道对象的存在Dog以及其name变量的存在