Java中的默认构造函数

Jer*_*auw 51 java inheritance constructor

我知道我在这里问了一些严肃的问题......

我有一些课程Foo和一个课程Bar延伸Foo.在Foo我有一个构造函数的一组参数,它设置为它的领域.派生类Bar通常不需要修改它.现在我的IDE给了我"Foo中没有默认构造函数".从谷歌搜索中看,这似乎是因为"构造函数不是继承的".所以一切都很好,但是我现在如何在不重复每个派生类的构造函数的情况下使用它?我假设有一个更理智的方法?

ars*_*jii 65

使用super构造函数:

public Bar(int a, double b, ...) {
    super(a, b, ...);
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是“理智”的方法。从超类继承构造函数将是完全疯狂的,请考虑抽象类等。或者您在标准库中拥有的构造函数数量(并且很多它们将无法正常工作) (2认同)

Jon*_*eet 17

所以一切都很好,但是我现在如何在不重复每个派生类的构造函数的情况下使用它?

您确实需要复制构造函数签名 - 如果您希望子类具有相同签名的构造函数.但是你不需要复制代码 - 你只需链接到超类构造函数:

public Bar(int x, int y) {
    super(x, y);
    // Any subclass-specific code
}
Run Code Online (Sandbox Code Playgroud)

当然,如果你可以从一组不同的参数中计算出超类参数,那很好.例如:

public Bar(int x) {
    super(x, x * 2);
    // Any subclass-specific code
}
Run Code Online (Sandbox Code Playgroud)

你真的需要弄清楚构造一个所需的信息Bar- 应该决定你的构造函数.

如果这是一个问题,那么你可能会过度使用继承.很难说不确定你的实际类是什么,但你应该看看使用组合而不是继承.这不是灵丹妙药,但它可以避免这种事情.

  • 该死的乔恩 - 我把这个放在包里! (4认同)

m0s*_*it0 5

不,没有其他“理智”的方法。如果您的基类没有默认构造函数,则必须从所有子类中显式调用正确的构造函数。

请注意,这并不意味着儿童类需要有精确的比基类的构造函数相同。例如,这是完全正确的:

class Foo {

    protected int a;
    protected int b;

    protected Foo(final int a, final int b) {
        this.a = a;
        this.b = b;
    }
}

class Bar extends Foo {

    protected Bar() {
        super(0,0);
    }
}
Run Code Online (Sandbox Code Playgroud)