我看到下面的代码online在我更改初始化顺序(即通过放置 public int seatHeight
)之后,子类构造函数在初始化其自己的变量(即 seatHeight = startHeight;
)之前调用父类(super class)构造函数。之前super(startCadence, startSpeed, startGear);
,我的 IDE 显示错误消息。我只是想知道在子类可以初始化自己的变量之前调用父类(super class)构造函数的原因是什么?管理父类(super class)和子类初始化的一些规则是什么?
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;
}
}
最佳答案
子类是父类(super class)的扩展,可以访问父类(super class)中的任何公共(public)/ protected /包成员和方法。
除非将其强制转换为子类,否则父类(super class)无法访问子类的成员/方法。通过直接面向对象,父类(super class)对子类一无所知。
由于子类可以访问父类(super class)中的成员/方法,因此必须在子类之前初始化父类(super class),以便任何初始值、内存位置等都具有有效的起始值。
顺便说一句,在我使用过的所有面向对象语言中都是如此,很确定这是一个普遍的真理。
关于java - 为什么子类必须先调用父类(super class)的构造函数才能初始化自己的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36415169/