当前位置: 首页 > 知识库问答 >
问题:

为什么子类必须调用超类构造函数才能初始化它自己的变量[duplicate]

郜玉石
2023-03-14

我在网上看到了下面的代码,并且子类构造函数在初始化它自己的变量(即public int seatheight)之前调用了超类构造函数,在我更改初始化顺序之后,即通过将seatheight=starteight放在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;
    }   

}

共有1个答案

靳祺然
2023-03-14

子类是超类的扩展,可以访问超类中的任何公共/受保护/包成员和方法。

超类无法访问子类的成员/方法,除非您将其转换为子类。根据直接的OO,超类对子类一无所知。

由于子类可以访问超类中的成员/方法,所以必须在子类之前初始化超类,以便任何初始值、内存位置,无论什么,都具有有效的起始值。

顺便说一句,这在我使用过的所有OO语言中都是正确的,非常肯定这是一个普遍的真理。

 类似资料:
  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 问题内容: 因此,问题或多或少是我写的。我知道可能还不清楚,所以我举一个例子。 我有Tree类,其中有Node类,并且Tree的空构造函数被编写为: Eclipse给我一个错误:空构造函数中的“ new RBTree()”没有“由于某些中间构造函数调用而导致RBTree类型的封闭实例不可用”。但是,如果将RBNode更改为静态类,则没有问题。 那么,为什么在类为静态的时候它可以工作。 顺便说一句,

  • 问题内容: 为什么必须在构造函数完成之前初始化最终变量? 当我编译这段代码时,我得到这样的错误 err:变量q可能尚未初始化 问题答案: 官方理由是,它是由定义的Java语言规范8.3.1.2: 必须在声明该类的每个构造函数的末尾绝对分配一个空白的最终实例变量;否则会发生编译时错误。 空白的final是其声明缺少初始化程序(即您所描述的内容)的final变量。

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它

  • 子类被迫显式调用基类的构造函数似乎没有意义。如果用户可以创建自己的构造函数,而不局限于基类,将会更加灵活。有谁能告诉我为什么JAVA里要强制这种行为?这有什么好处呢?