java - 为什么子类必须先调用父类(super class)的构造函数才能初始化自己的变量

标签 java constructor initialization subclass superclass

我看到下面的代码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/

相关文章:

java - VTD-XML 遮盖同级元素的命名空间并添加意外的 ns

function - 在 rust trait 中实现构造函数

c++ - 无法在类中初始化 unique_ptr 的 vector

python - OOP:在初始化类时使用条件语句

java - 获取结果集时出错

java - 将 jsp 页面与其他 URL 内容平铺

java - 如何在不重复代码的情况下编写子类构造函数?

c++ - 没有复制构造函数的初始化变量

数组的 C++ 构造函数初始值设定项

linux - chkconfig 不添加 redis 初始化脚本