[英]Java class inheritance of variables and methods
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
,这是超类Camera
。
现在,由于我正在创建Camera
Object
,所以我希望方法show()
可以打印13,但是此代码可以打印7,这是超类Machine
声明的。 我意识到Machine的变量类型通过show()
方法combo
了参考变量,但是该值不应该返回13,因为Object本身是Camera
的实例? 预先感谢您的帮助!
在这种情况下,有两个称为info1
的变量-子类中的变量不会覆盖超类中的变量,它将show
方法打印属于Machine
的变量。
子类中声明的变量info1
被认为隐藏了父类中声明的变量,如JLS的8.3节所述 :
如果类声明了具有特定名称的字段,则称该字段的声明隐藏了超类和该类的超接口中所有相同名称的字段的所有可访问声明。
该info1
变量Camera
不超载info1
变量Machine
,而是隐藏它。
在这种情况下, show()
方法只能看到在其自己的类中声明的info1
。 Machine
方法无法访问子类中存在的字段。
如果希望能够在子类中更改值,则需要在构造器中进行设置,如下所示:
class Camera extends Machine {
public Camera() {
super.info1 = 13;
}
}
在这种情况下,您将在Machine
中显式引用info1
并更改其值。
正如@manouti提到的, info1
是每个类中的两个不同变量(它们不会被覆盖)。 但是,您可以实现“必需”功能,而无需通过更改如下的Camera
类来引入新变量:
class Machine {
int info1 = 7;
public void show(){
System.out.println(info1);
}
}
class Camera extends Machine {
public Camera() {
info1 = 13;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.