我知道这个行为,但我不是100%肯定为什么会发生这种情况.
我知道在 java中没有实例变量的多态.变量由编译器静态解析.
但在下面我很困惑:
我知道在 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 } }
我承诺在第1行它将显示动物,因为它是静态类型(由编译器解决).
什么困惑我是为什么第3行也会显示我的名字是动物?
该方法将尝试在Dog上调用,因为这是运行时的实际对象,并且由于它不被覆盖,所以该方法将在父类Animal中找到.
我没有得到的是为什么在方法显示中使用父类的名称,如果操作的实际对象是Dog.它不会隐藏父的名称变量吗?它似乎不像我的静态解决,因为类型是狗.
这不是Oject的内存布局的一部分吗?
这就像内部显示只有父的变量是可见的.为什么?
更新:
@Razvan和@LouisWasserman的答案一直很有帮助.
以下是我最后一个问题:
两者的观点似乎如下:
从@Razyan
System.out.println(“My name is”this.name); //< - 注意这一点
来自@Louis
这就是指动物,而且()的实现是在Animal类中.
到目前为止还好但是这些点如何与如下修改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();
Current class is Dog
My name is animal
我期待这个展示内容将是动物,因为我明白了这里的答案.但不是.为什么?