java – 成员变量的多态.我知道这是不可能的,我不明白这个具体情况

前端之家收集整理的这篇文章主要介绍了java – 成员变量的多态.我知道这是不可能的,我不明白这个具体情况前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道这个行为,但我不是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  
   }  
}

我承诺在第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

我期待这个展示内容将是动物,因为我明白了这里的答案.但不是.为什么?

解决方法

当您调用d.display()时,将调用Animal.display(),因为您不要在Dog类中覆盖它.

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

public void display(){  
    super.display();
 }

而Animal.display()的实现是:

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

Animal.display()方法甚至不知道存在一个对象Dog,因此它的名称变量

原文链接:/java/123032.html

猜你在找的Java相关文章