子类不需要父类构造函数

3
我是一名在Eclipse中编程的程序员,最近发现了一些奇怪的事情...
如果我像下面这样创建一个类:
public abstract class Test {
    public Test(Object obj) {}
}

任何子类显然都需要填写 super()
同样适用于:
public abstract class Test {
    public Test(Object[] obj) {}
}

那么为什么当我执行以下操作并没有提供super()时,我的IDE不会报错呢?
public abstract class Test {
    public Test(Object... obj) {}
}

在你说“只需运行程序,它就会失败”之前,我使用了JUnit并且程序正常运行,而没有在扩展类中提供构造函数。我的问题是,为什么会发生这种情况?

子类看起来像这样:

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

4
使用public Test(Object... obj)这种方法,您可以输入0个或多个参数。默认情况下,如果构造函数没有参数,则会隐式调用super()。因此,您不必自己调用它。 - TuyenNTA
@TuyenNguyen 哎呀呀呀呀!太棒了。你知道是否存在一种注释来强制使用多个吗? - user5549921
我不认为它有。因为语法 Object... obj 用于一般情况,所以您可以传递参数或不传递参数,但如果您想强制传递参数,则只需使用 List 即可。 - TuyenNTA
@TuyenNguyen 好的。非常感谢。您应该考虑将这个作为一个答案发布,这样我就可以接受它了! - user5549921
1
要强制调用者提供至少一个参数:public Test(Object requiredParam, Object... optionalParams) - Klitos Kyriacou
@KlitosKyriacou 啊,谢谢! - user5549921
1个回答

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

1
非常好的回答。我希望你不介意我的编辑。我尝试保留你的意思,但让语言更符合“美国人”的口味。 - Mad Physicist
谢谢 @MadPhysicist,我的错别字很糟糕,需要改进! - TuyenNTA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接