class Machine {
int info1 = 7;
public void show(){
System.out.println(info1);
}
}
class Camera extends Machine {
int info1 = 13;
}
public class Application{
public static void main(String[] args) {
Machine combo = new Camera();
combo.show();
}
}
根据我的理解,我通过实例化combo
的类创建了一个名为Camera
的对象,但我使用的是Machine
的变量类型,它是{{的超类1}}。
现在,由于我正在创建Camera
Object
,我希望方法Camera
能够打印13,但是此代码会打印7,如超类{{ 1}}。我意识到变量类型的Machine赋予方法show()
引用变量Machine
,但是由于Object本身是combo
的实例,因此不应返回值13。提前感谢您的帮助!
答案 0 :(得分:3)
在这种情况下,有两个变量称为info1
- 子类中的变量不会覆盖超类中的变量,show
方法将打印属于{{1}的变量}。
在子类中声明的变量Machine
被认为隐藏了父类中声明的变量,如section 8.3 of the JLS中所述:
如果类声明了具有特定名称的字段,那么该字段的声明将被称为 hide 任何和所有可访问的超类中具有相同名称的字段的声明,以及该类的超接口
答案 1 :(得分:2)
info1
中的Camera
变量并未超载info1
中的Machine
变量,而是hiding it.
在这种情况下,show()
方法只能看到在其自己的类中声明的info1
。 Machine
上的方法无法访问子类中存在的字段。
如果您希望能够更改子类中的值,则需要在构造函数中设置它,如下所示:
class Camera extends Machine {
public Camera() {
super.info1 = 13;
}
}
在这种情况下,您明确引用info1
中的Machine
并更改其值。
答案 2 :(得分:1)
正如@manouti所提到的,info1
是每个类中的两个不同的变量(它们没有被覆盖)。但是,您可以通过更改Camera
类来实现“必需”功能,而无需引入新变量:
class Machine {
int info1 = 7;
public void show(){
System.out.println(info1);
}
}
class Camera extends Machine {
public Camera() {
info1 = 13;
}
}