Java中的默认构造函数

我知道我在这里问一些严重的问题

我有一些Foo类和一个扩展Foo的类Bar 。 在Foo我有一个构造函数,它将一组参数设置为其字段。 导出Bar等类通常不需要修改。 现在我的IDE给我“Foo中没有默认的构造函数” 。 从一点谷歌search这似乎是因为“构造函数不被inheritance”。 所以一切都很好,但是我怎样才能在不重复每个派生类中的构造函数的情况下工作? 我假设有一个更理智的方法?

使用super构造函数:

 public Bar(int a, double b, ...) { super(a, b, ...); } 

所以一切都很好,但是我怎样才能在不重复每个派生类中的构造函数的情况下工作?

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

 public Bar(int x, int y) { super(x, y); // Any subclass-specific code } 

当然,如果你可以从一组不同的参数中得出超类参数,那也没关系。 例如:

 public Bar(int x) { super(x, x * 2); // Any subclass-specific code } 

你真的需要弄清楚构build一个Bar需要什么信息 – 这个应该决定你的构造函数。

如果这是一个问题,可能是你过度使用inheritance。 很难肯定地说不知道你的实际类是什么,但你应该看看使用组合而不是inheritance。 这不是万能的,但它可以避免这种事情。

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

注意这并不意味着子类需要与基类具有完全相同的构造函数。 例如,这是完全有效的:

 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); } } 

这个问题解决了:

 class Foo{ Foo(int a, int b){} } class Bar extends Foo{ //Here must be a constructor OR declare a constructor in Foo without parameters Bar(){super(1,1)} //this is an example } 

其他解决scheme是:

 class Foo{ Foo(int a, int b){} Foo(){} } class Bar extends Foo{ } 

请记住,如果在SuperClass (本例中为Foo)中有一个具有参数的构造函数,那么子类 (本例中为Bar)的隐式构造函数将始终隐式调用“ Super() ”(总是必须是除非明确)。

如果由于devise原因,JVM不提供默认的构造函数。 你可以使用相同的签名在Bar中定义构造函数,并调用super()。

 public Bar(int x,int y) { super(x,y); }