0

我目前正在学习 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);真正起作用的问题。我将非常感谢某种形式的解释,以便像我这样的初学者可以真正理解而不是给我定义。

4

2 回答 2

4

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

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

于 2013-11-11T18:23:26.860 回答
1

假设您的类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构造函数的调用在做什么。

于 2013-11-11T18:25:20.567 回答