加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:15:11 所属栏目:Java 来源:网络整理
导读:我知道这个行为,但我不是100%肯定为什么会发生这种情况. 我知道在 java中没有实例变量的多态.变量由编译器静态解析. 但在下面我很困惑: class Animal{ String name = "Animal"; public void display(){ System.out.println("My name is "+ name); } } publ
我知道这个行为,但我不是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,因此它的名称变量

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读