巨塔微尘
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="外狗";这行代码 测试类结果为: 内狗 为什么?
子类: public class Dog extends Animal{ String name="外狗"; // 这是定义了一个新的变量name,下面的name也是修改的这个新的变量,而不是父类中定义的那个name public Dog(){ name="内狗"; } }
如果你把自类中String name改成String name1,运行结果会是 内狗。
Animal dog=new Dog();
System.out.println(dog.name);
//Dog调用的是父类中的name属性或着(子类中继承或重写的父类属性),
String name="外狗"; // 这是定义了一个新的变量name,不能被父类引用
错了 没弄清楚
初始化顺序 父类 》》子类 父类对象》子类对象》构造方法
正如我采纳答案所说,我在子类定义了一个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
对象和引用这部分我弄的有点不清楚 ,请详解
为什么我写了一个结果还是没变呢?
这是为什么呢。。。
Java入门第二季 升级版
531107 学习 · 6311 问题
相似问题