父类:
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
对象和引用这部分我弄的有点不清楚 ,请详解
为什么我写了一个结果还是没变呢?
这是为什么呢。。。