为了账号安全,请及时绑定邮箱和手机立即绑定

一个困惑我几天才解决的看似简单的问题,明白了对多态理解更深了一点

父类:
public class Animal {
 String name="动物"; 
}

子类:
public class Dog extends Animal{
 String name="外狗";
 
 public Dog(){   
  name="内狗";
 }
}

测试类:
public class TestAnimal {
 public static void main(String[] args) {
  Animal dog=new Dog();
  System.out.println(dog.name);
 }
}

问题:
测试类结果为:
动物
但是当我注释掉 子类String name="外狗";这行代码
测试类结果为:
内狗
为什么?


正在回答

8 回答

子类:
public class Dog extends Animal{
 String name="外狗"; // 这是定义了一个新的变量name,下面的name也是修改的这个新的变量,而不是父类中定义的那个name
  
 public Dog(){   
  name="内狗";
 }
}

如果你把自类中String name改成String name1,运行结果会是 内狗。


0 回复 有任何疑惑可以回复我~

Animal dog=new Dog();

System.out.println(dog.name);

//Dog调用的是父类中的name属性或着(子类中继承或重写的父类属性),

String name="外狗"; // 这是定义了一个新的变量name,不能被父类引用


0 回复 有任何疑惑可以回复我~

错了  没弄清楚

0 回复 有任何疑惑可以回复我~

初始化顺序 父类 》》子类       父类对象》子类对象》构造方法

0 回复 有任何疑惑可以回复我~

      正如我采纳答案所说,我在子类定义了一个String name="外狗",明确了这个变量是子类的变量,它会根据多态的规则,子类同名属性并不会覆盖父类属性,而是都存在的(存在哪里?内存这块我还不清楚),所以子类构造函数初始化了子类的属性name为“内狗”,而Anima dog=new Dog(),  dog还是用的父类的属性name="动物"

     而我没有明确定义String name=“外狗”这句,子类构造函数默认用的name是父类的name(很容易就以为初始化的是子类的属性name), name="内狗"这行等同于super.name="内狗"。

    想更清楚的话,可以去看看这个博客 http://blog.csdn.net/l_b_h_w/article/details/52665231

2 回复 有任何疑惑可以回复我~
#1

米柚

多谢~受益了!
2017-02-19 回复 有任何疑惑可以回复我~
#2

ffs555

第一次运行的结果不是外狗吗?dog指向的不是子类的属性name吗?为什么是父类的name?
2017-02-23 回复 有任何疑惑可以回复我~
#3

ffs555

Anima dog=new Dog(), 为什么dog还是用的父类的属性name="动物"? 不是子类才对吗?
2017-02-23 回复 有任何疑惑可以回复我~

对象和引用这部分我弄的有点不清楚 ,请详解

0 回复 有任何疑惑可以回复我~

为什么我写了一个结果还是没变呢?

0 回复 有任何疑惑可以回复我~

这是为什么呢。。。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

一个困惑我几天才解决的看似简单的问题,明白了对多态理解更深了一点

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号