为什么子类必须先调用超类构造函数才能初始化自己的变量
why subclass must call superclass constructor before the subclass can initialise its own variable
我看到下面的代码online,在我改变初始化顺序后,子类构造函数在初始化它自己的变量(即public int seatHeight
)之前调用超类构造函数,即通过将seatHeight = startHeight;
在 super(startCadence, startSpeed, startGear);
之前,我的 IDE 显示错误信息。我只是想知道在子类可以初始化自己的变量之前调用超类构造函数的原因是什么?管理超类和子类初始化的一些规则是什么?
public class MountainBike extends Bicycle {
public int seatHeight;
public MountainBike(int startHeight, int startCadence,
int startSpeed, int startGear) {
super(startCadence, startSpeed, startGear);//when change order with seatHeight = startHeight, IDE display error
seatHeight = startHeight;
}
public void setHeight(int newValue) {
seatHeight = newValue;
}
}
subclass 是 superclass 的扩展,可以访问 superclass.
中的任何 public/protected/package 成员和方法
超级class 无法访问子class 的members/methods,除非您将其转换为子class。通过直接 OO,superclass 对 subclass.
一无所知
由于subclass可以访问superclass中的members/methods,superclass必须在subclass之前初始化,这样任何初始值,内存位置,任何具有有效起始值的东西。
顺便说一句,这在我使用过的所有 OO 语言中都是如此,很确定这是一个普遍的真理。
我看到下面的代码online,在我改变初始化顺序后,子类构造函数在初始化它自己的变量(即public int seatHeight
)之前调用超类构造函数,即通过将seatHeight = startHeight;
在 super(startCadence, startSpeed, startGear);
之前,我的 IDE 显示错误信息。我只是想知道在子类可以初始化自己的变量之前调用超类构造函数的原因是什么?管理超类和子类初始化的一些规则是什么?
public class MountainBike extends Bicycle {
public int seatHeight;
public MountainBike(int startHeight, int startCadence,
int startSpeed, int startGear) {
super(startCadence, startSpeed, startGear);//when change order with seatHeight = startHeight, IDE display error
seatHeight = startHeight;
}
public void setHeight(int newValue) {
seatHeight = newValue;
}
}
subclass 是 superclass 的扩展,可以访问 superclass.
中的任何 public/protected/package 成员和方法超级class 无法访问子class 的members/methods,除非您将其转换为子class。通过直接 OO,superclass 对 subclass.
一无所知由于subclass可以访问superclass中的members/methods,superclass必须在subclass之前初始化,这样任何初始值,内存位置,任何具有有效起始值的东西。
顺便说一句,这在我使用过的所有 OO 语言中都是如此,很确定这是一个普遍的真理。