首页 > 解决方案 > Java:为什么通过将子类保存为父类,子类的属性会变为父类的默认值?

问题描述

我还在学习Java(这是我关于SO的第一个问题),所以如果这种问题在这里放错了地方或者我的措辞不正确,请原谅我!

我目前正在研究继承和多态性,尽管谷歌搜索了很多,但无法回答我的以下问题。

public class Animal {
    public String name = "Bello";

}

public class Cat extends Animal {
    public String name = "Kitty";

    public static void main(String[] args) {

        Cat cat1 = new Cat();
        Animal animal1 = cat1;
        System.out.println(cat1.name);
        System.out.println(animal1.name);
    }
}

System.out.println(cat1.name);打印出来Kitty,但System.out.println(animal1.name);打印出来Bello

因此,显然属性名称的值会随着子类的实例被保存为父类的对象而改变。为什么父类将值更改为她自己的默认值,即使它已经在cat1中设置?好像有什么。要知道我无法弄清楚..

标签: javainheritancepolymorphismparent-child

解决方案


父类和子类中同名的变量称为变量隐藏。但是子类将可以访问这两个属性。

使用下面修改后的代码中显示的 this 和 super 关键字访问它

class Animal {
    public String name = "Bello";

}

public class Cat extends Animal {
    public String name = "Kitty";

    Cat(){
        System.out.println(this.name); //Kitty
        System.out.println(super.name); //Bello
    }

    public static void main(String[] args) {

        Cat cat1 = new Cat();
        Animal animal1 = cat1;

        System.out.println(cat1.name);
        System.out.println(animal1.name);
    }
}

推荐阅读