java - 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中设置?好像有什么。要知道我无法弄清楚..
解决方案
父类和子类中同名的变量称为变量隐藏。但是子类将可以访问这两个属性。
使用下面修改后的代码中显示的 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);
}
}
推荐阅读
- c++ - 为什么 std::isdigit 接受 int?
- r - 在小鼠/多重插补之后,如何合并 RF 和 SVL?(GLM 有效)
- eclipse - Apache wicket Tomcat 问题:java.lang.ClassNotFoundException: org.apache.wicket.protocol.http.WicketFilter
- python - pyqt5 中带有自定义小部件的拖放功能,创建内容不可见的小部件
- php - 解码波浪线和特殊字符(PHP 和 MYSQL)的问题
- arrays - 查找不在二维数组中的用户的值的数量
- google-apps-script - 复制并粘贴最后一个数据
- r - 使用重复列表更改数据框的维度
- c# - 将 WaterfallDialog 的 stepContext 的结果传递给 DialogContext
- angular - 从网页访问 Chrome 应用程序(来自 Angular)