【问题标题】:Java - attribute missing when using super in child class [closed]Java-在子类中使用super时缺少属性[关闭]
【发布时间】:2020-10-19 06:40:51
【问题描述】:

我正在创建一些飞行对象数组的 Java 代码,它们都有一个属性 price (double)。我对继承有点陌生,这是我第一次使用 super 关键字。当我在数组中创建一个子类对象 Airplane 时,价格特征似乎没有正确地通过构造函数。

这是我的 FlyingObject 构造函数:

公共类 FlyingObject {

protected double price;

public FlyingObject()
{
    price = 0;
}

public FlyingObject(double aPrice)
{
    price = aPrice;
}

这是我的飞机构造函数:

// CONSTRUCTORS

public Airplane ()
{
    super();
    brand = "Unknown brand";
    horsepower = 0;
}

public Airplane (String aBrand, double aPrice, int aHorsepower)
{
    super(aPrice);
    brand = aBrand;
    horsepower = aHorsepower;
}

当我使用参数 String、double 和 int 创建飞机时,字符串(品牌)和 int(马力)得到正确注册,但价格保持在 0。我做错了什么我错过了?任何帮助将不胜感激。

编辑:发现我做错了什么。愚蠢的错误。

在我的 Airplane 类中,我将 price 重新定义为实例变量并忘记了它,这覆盖了 FlyingObjects 中的 price。

只要我取出那个额外的价格变量并且只有价格变量来自超类(如预期的那样),那么一切正常。

下次将发布更好的示例(可重复)。干杯

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/51845169/…
  • 无关:没有两个构造函数做不同的事情。让 FlyingObect 中的无参数构造函数调用 other 构造函数,例如 this(0)
  • 除此之外,请提供真实的minimal reproducible example。您显示的代码看起来正确。所以请给我们显示问题的代码。你看,你对你的代码做了假设(正确注册),但是如果你对代码的假设都是正确的,你就不会在这里寻求帮助。所以,请:编辑您的问题并添加更多代码。
  • 大家好,很抱歉尚未熟悉此处提问的最佳实践。我将确保在将来包含一个最小的可重现示例。感谢大家的回答。我将在今天晚些时候查看代码,看看是否可以让代码重新出现在这个可重现的小示例中。随意关闭这个问题,如果问题仍然存在,我可以重新发布它,尽管使用正确的示例。

标签: java constructor super


【解决方案1】:

我不太确定您遇到的问题是什么。我刚刚在jshell中试了一下,效果还不错:

public class FlyingObject {
    protected double price;

    public FlyingObject() { price = 0; }

    public FlyingObject(double aPrice) { price = aPrice; }
}

public class Airplane extends FlyingObject {
    int horsepower;
    String brand;

    public Airplane() { 
        super(); 
        brand = "Unknown brand";
        horsepower = 0;
   }

   public Airplane(String aBrand, double aPrice, int aHorspower) {
        super(aPrice);
        brand = aBrand;
        horsepower = aHorsepower;
   }
}

如果我随后调用 Airplane plane = new Airplane("Boeing", 500000, 800);,我会得到一个 Airplane 对象,其结果是 plane.price = 500000。

顺便说一句,您可能需要考虑(而不是 aHorsepoweraBrand 等)在构造函数中使用 horsepowerbrand,然后使用 this 关键字作为如下:

public Airplane(String brand, double price, int horsepower) {
    super(price);
    this.brand = brand;
    this.horsepower = horsepower;
}

【讨论】:

  • 感谢您为帮助提问者所做的努力,但好吧:“无法重现问题”清楚地表明该问题应该被关闭,而不是回答。我已经写了一篇关于这个的评论。所以,从这个角度来看:请了解一下人们应该如何/在这里问什么。你看,这个问题将被关闭,除非 OP 改进它。然后可能会被删除,你的回答很好。所以:最好把时间和精力花在可以能回答的问题上。告诉 OP“无法复制”不是答案。
  • 哦,好的。感谢您的建议!
  • Ben Rosenberg,非常感谢您的回答。正如我上面提到的,我的帖子似乎没有遵守提供可重现示例的准则,所以我已经告诉模组他们可以关闭它,如果他们愿意,我会查看我的代码并尝试重现该示例。如果问题仍然存在,我将发布一个新的(更正确的表述)帖子。但我要感谢你看它。也许我的问题来自通过我的驱动程序类的类的实现,尽管我还不确定为什么。无论如何,感谢您调查它,非常感谢。
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2022-12-09
  • 2022-01-19
  • 2020-09-19
  • 2017-10-03
  • 2011-06-16
相关资源
最近更新 更多