Java子类构造函数继承的成员
我有一个问题,为什么这段代码在执行时会打印出值0。我不太明白子类构造函数中发生了什么,为什么当我删除被重写的方法implicitValue时,它会输出10。子类构造函数是否使用超类构造函数? 多谢各位Java子类构造函数继承的成员,java,constructor,subclass,superclass,Java,Constructor,Subclass,Superclass,我有一个问题,为什么这段代码在执行时会打印出值0。我不太明白子类构造函数中发生了什么,为什么当我删除被重写的方法implicitValue时,它会输出10。子类构造函数是否使用超类构造函数? 多谢各位 class SuperClass { protected int superClassValue; public SuperClass() { superClassValue = implicitValue(); } public int imp
class SuperClass {
protected int superClassValue;
public SuperClass() {
superClassValue = implicitValue();
}
public int implicitValue() {
return 10;
}
public int getValue() {
return superClassValue;
}
}
class SubClass extends SuperClass {
private int subClassValue;
public SubClass() {
subClassValue = 20;
}
public int implicitValue() {
return subClassValue;
}
}
class Example {
public static void main(String argv[]) {
SubClass ss = new SubClass();
System.out.println("The value is " + ss.getValue());
}
}
听起来您的重写方法或子类有问题。因为这听起来像是当它实现一个变量时,该值没有被实例化,所以它默认为0,然后当您删除它时,超类将接管,导致您得到值10。是的,如果没有明确给出这样的调用,子类构造函数将隐式调用超类构造函数。但是它打印
0
,因为implicitValue
方法在子类中被重写
调用超类构造函数。在这里,将创建对象的超类
部分。所有变量都已初始化。由于没有给出显式值,编译器会给出superClassValue
默认值0
。然后,超类构造函数调用implicitValue()
,这将调用子类的方法。此方法返回超类值
,该值已初始化为0
。此值显式分配回超类值
子类将其子类值初始化为10
调用getValue()
方法,它返回superClassValue
,即0
<代码>打印值为0时
如果要删除子类
中的隐式值
方法,那么它将继承超类
的方法版本,该方法返回10
如果要修改子类
中的隐式值
方法以返回5
,那么它将初始化超类值
为5
,并打印值为5
TL;博士
问题是SubClass
中的implicitValue
由超类隐式超类构造函数(super()
)通过implicitValue()
方法在SubClass value=20之前使用
将在子类构造函数中执行,因此它返回SubClass value
的默认值,int
字段的默认值为0
子类构造函数是否使用超类构造函数 是的,子类构造函数在开始时总是调用超类构造函数,所以代码
public SubClass() {
subClassValue = 20;
}
与
public SubClass() {
super();//superclass constructor
subClassValue = 20;
}
但是让我们看看你的代码。您正在打印超类中存在的getvlue()
方法的结果
public int getValue() {
return superClassValue;
}
如您所见,它返回超类值的值。在调用getvlue()
之前,您正在创建ss
实例,因此您正在调用代码
super();//superclass constructor
subClassValue = 20;
这意味着您正在调用超类的构造函数
public SuperClass() {
superClassValue = implicitValue();
}
因此,this.superClassValue
使用返回值implicitValue()
方法初始化,但由于(后期绑定),JVM将尝试从this
的实际类开始搜索此方法的实现,该类是子类,由于该类有自己的重写版本,因此将调用它
public int implicitValue() {
return subClassValue;
}
但是子类值
尚未设置为任何值
super();// <-- we are still here
subClassValue = 20;// this line was not executed yet
所以
将返回0
在您的情况下:默认情况下将调用超类构造函数
当Java进程:new SubClass()时。它将首先调用超类的构造函数。当调用超类的构造函数时,implicitValue()返回的值将分配给superClassValue-调用的方法implicitValue()是子类的方法(而不是如您所想调用SuperClass的implicitValue()-OOP的多态性特性)。调用子类的implicitValue()时,子类值尚未初始化(子类值=20;尚未运行),因此子类值仍然为零。这就是您在输出中看到零的原因
移除子类中的override implicitValue时。调用的implicitValue()是SupperClass-->的implicitValue,这就是为什么在输出中看到10
superClassValue = implicitValue(); //will be initialized with 0;
public int getValue() {
return superClassValue;
}