我有一个问题,为什么这段代码在执行时会打印出值 0。我不完全理解 SubClass 构造函数中发生了什么,以及为什么当我删除被覆盖的方法 implicitValue 时,它打印出 10. SubClass 构造函数是否使用 SuperClass 构造函数? 谢谢。
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());
}
}
最佳答案
长话短说
问题是 SubClass
中的 implicitValue
被父类(super class)隐式 SuperClass 构造函数(super()
)通过 implicitValue()< 使用
方法,在 subClassValue = 20;
之前会在 SubClass 构造函数中执行,所以它返回 subClassValue
的默认值,对于 int
字段是0
。
Does the SubClass constructor make use of the SuperClass constructor?
是的,开始时子类构造函数总是调用父类(super class)构造函数,所以代码
public SubClass() {
subClassValue = 20;
}
与
相同public SubClass() {
super();//superclass constructor
subClassValue = 20;
}
但是让我们看一下您的代码。您正在打印父类(super class)中存在的 getVlaue()
方法的结果
public int getValue() {
return superClassValue;
}
如您所见,它返回 superClassValue
的值。在调用 getVlaue()
之前,您正在创建 ss
实例,因此您正在调用代码
super();//superclass constructor
subClassValue = 20;
这意味着你正在调用看起来像父类(super class)的构造函数
public SuperClass() {
superClassValue = implicitValue();
}
所以 this.superClassValue
是用 implicitValue()
方法的返回值初始化的,但是因为 dynamic binding (后期绑定(bind))JVM 将尝试从 this
的实际类开始搜索此方法的实现,该类是 SubClass
,并且由于此类有自己的覆盖版本,因此它将是调用
public int implicitValue() {
return subClassValue;
}
但是 subClassValue
还没有设置任何值
super();// <-- we are still here
subClassValue = 20;// this line was not executed yet
所以 subClassValue
仍然有它的默认值 0
,这意味着
superClassValue = implicitValue(); //will be initialized with 0;
所以
public int getValue() {
return superClassValue;
}
将返回0
。
关于Java子类构造函数继承成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099157/