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

来源:10-1 Java 中的多态

巨塔微尘

2016-12-14 21:55

父类:
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回答

  • 席原同学
    2016-12-14 22:46:11
    已采纳
    子类:
    public class Dog extends Animal{
     String name="外狗"; // 这是定义了一个新的变量name,下面的name也是修改的这个新的变量,而不是父类中定义的那个name
      
     public Dog(){   
      name="内狗";
     }
    }

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


  • 0821
    2016-12-31 19:02:08

    Animal dog=new Dog();

    System.out.println(dog.name);

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

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


  • 慕粉2238071731
    2016-12-25 15:46:34

    错了  没弄清楚

  • 慕粉2238071731
    2016-12-25 15:21:03

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

  • 巨塔微尘
    2016-12-15 13:36:18

          正如我采纳答案所说,我在子类定义了一个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

    ffs555

    Anima dog=new Dog(), 为什么dog还是用的父类的属性name="动物"? 不是子类才对吗?

    2017-02-23 01:50:25

    共 3 条回复 >

  • 慕神1905738
    2016-12-14 23:29:08

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

  • 慕神1905738
    2016-12-14 23:12:01

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

  • 慕神1905738
    2016-12-14 22:28:29

    这是为什么呢。。。

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

531107 学习 · 6311 问题

查看课程

相似问题