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

为什么需要调用超类构造函数?[副本]

罗鸿福
2023-03-14

我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的super(...)方法教程。

public MountainBike(int startHeight, 
                int startCadence,
                int startSpeed,
                int startGear) {
  super(startCadence, startSpeed, startGear);
  seatHeight = startHeight;
}

我最初的想法是,super(startCadence,startSpeed,startGear);会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示):

public MountainBike(int startHeight) {
 ... 
}

但是,正如我已经知道的那样,这是错误的,并且再次将我带到了super(startCadence,startSpeed,startGear);真正做什么的问题上。我会非常感谢一些形式的解释,这样像我这样的初学者就可以真正理解而不是给我定义

共有2个答案

锺离阿苏
2023-03-14

因为MountainBikeBike的子类,所以它应该可以在任何需要Bike对象的上下文中使用。如果不在子类的构造函数中调用父类的构造函数,则无法保证子对象被正确初始化以充当父类的实例

我隐约记得,在Java中,如果您不在子构造函数中显式调用父构造函数,则父构造函数的默认构造函数(即,不带参数)是隐式调用的。在您的情况下,这还不够,因为没有默认构造函数,或者您确实需要将提供给子构造函数的额外参数传递给父构造函数。

戎高爽
2023-03-14

让我们假设您的类mountainbike继承自bike。单词super是对类的父类的引用。

如果bike具有如下所示的构造函数:

public Bike(int startCadence, int startSpeed, int startGear) {
    cadence = startCadence;
    speed = startSpeed;
    gear = startGear;
}

然后是mountainbike构造函数,如下所示:

public MountainBike(int startCadence, int startSpeed, int startGear, int startHeight) {
    super(startCadence, startSpeed, startGear);
    seatHeight = startHeight;
}

几乎相当于这样:

public MountainBike(int startCadence, int startSpeed, int startGear, int startHeight) {
    super.cadence = startCadence;
    super.speed = startSpeed;
    super.gear = startGear;
    seatHeight = startHeight;
}

除了前者,我们称之为super构造函数更好。首先,它避免了重复代码。对于两个人来说,它节省了两行。例如,如果我需要在speed上包含一些验证逻辑,我可以将其包含在bike构造函数中,而不需要在mountainbike构造函数中重复该代码。

Chepner的回答解释了第二个版本可能有问题的其他一些原因。但这个答案希望有助于解释对super构造函数的调用在做什么。

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

  • 我问这个问题是因为在Python和Java中,如果父类构造函数需要0参数,则不需要调用super()。 Javascript 蟒蛇 Java

  • 问题内容: 可以这么说,我有一个扩展超类的子类。在什么情况下我需要显式键入以使超类构造函数运行? 我正在看一本书中有关抽象类的示例,当它们使用非抽象子类对其进行扩展时,该子类的默认构造函数为空,并且有一条评论说将调用超类的默认构造函数。同时,我还在这里看到有人未明确致电问题的实例。 与从子类的默认/非默认构造函数调用超类的默认/非默认构造函数有区别吗? 问题答案: 你 永远都不 需要 如果您不指定

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 我问这个问题是因为在Python和Java中,如果父类构造函数需要0参数,则不需要调用super()。 Javascript 蟒蛇 Java语言

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回