【问题标题】:Why is it necessary to invoke a superclass constructor? [duplicate]为什么需要调用超类构造函数? [复制]
【发布时间】:2013-11-23 15:35:32
【问题描述】:

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

【问题讨论】:

  • 在我看来不像是复制品

标签: java inheritance parent-child super


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    假设您的类MountainBike 继承自Bikesuper 这个词是对一个类的父类的引用。

    如果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 构造函数的调用在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2018-08-22
      • 2012-09-15
      • 2016-04-02
      相关资源
      最近更新 更多