【问题标题】:Child classes not requiring parent constructor不需要父构造函数的子类
【发布时间】:2018-01-10 07:57:01
【问题描述】:

我在 Eclipse 中编程,发现了一些奇怪的东西......

如果我这样创建一个类:

public abstract class Test {
    public Test(Object obj) {}
}

任何子类显然都需要填写super()

同样适用:

public abstract class Test {
    public Test(Object[] obj) {}
}

那么为什么当我执行以下操作时我的 IDE 没有抱怨,并且没有提供super()

public abstract class Test {
    public Test(Object... obj) {}
}

在你说“只运行程序,它会失败”之前,我使用了 JUnit,程序运行良好,没有在扩展类中提供构造函数。我的问题是,为什么会这样?

子类如下所示:

public class Child extends Test {
    // Should throw error.
}

【问题讨论】:

  • 使用此方法public Test(Object... obj),您可以输入0个或多个参数,默认情况下,如果构造函数具有0个参数,则super()将隐式调用。这样你就不必调用它了
  • @TuyenNguyen 啊啊啊啊啊!太精彩了。你知道是否存在一个 Annotation 来强制多个?
  • 我不认为它有。因为语法 Object... obj 用于一般情况,所以你可以传递参数或不传递参数,但你想强制它必须传递参数,那么你只需要使用 List 代替
  • @TuyenNguyen 好的。非常感谢。您应该考虑将其发布为答案,以便我接受!
  • 强制调用者提供至少一个参数:public Test(Object requiredParam, Object... optionalParams)

标签: java constructor abstract-class extends


【解决方案1】:

使用此方法public Test(Object... obj),您可以输入 0 个或多个参数。默认情况下,如果构造函数没有显式调用父构造函数,则 super() 将被隐式调用。您不必显式调用它,因为语法 Object... obj 用于一般情况,无论您是否传入参数。如果你想强制用户传入一个参数,那么你只需要将参数声明为List

【讨论】:

  • 非常好的答案。我希望你不介意我的编辑。我试图保留你的意思,但让语言更符合“murican”。
  • 感谢@MadPhysicist,我的错字很糟糕,需要改进!
猜你喜欢
  • 2018-02-28
  • 2014-02-17
  • 2014-04-23
  • 2013-10-25
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多