通过施工到超级

时间:2011-05-11 19:52:58

标签: java oop inheritance constructor super

我想知道我是否有一个带有x个不同构造函数的抽象超类,并且我希望能够在子类中使用所有这些构造函数,我是否必须在子类中编写所有x构造函数并让它们全部调用超级(...)?好像冗余代码..

清晰度的一个例子:

public class SuperClass {
public SuperClass() {
...
}
public SuperClass(double d) {
...
}
public SuperClass(BigDecimal b) {
...
}
public SuperClass(BigDecimal b, String s) {
...
}
[...]
}

我不需要:

public class SuperClass {
public SubClass() {
super();
}
public SubClass(double d) {
super(d);
}
public SubClass(BigDecimal b) {
super(b);
}
public SuperClass(BigDecimal b, String s) {
super(b, s);
}
[...]
}

4 个答案:

答案 0 :(得分:5)

但你必须这样做。通过这种方式,您可以决定要在子类中公开的内容。此外,一些构造函数可能不适合子类,因此默认情况下,如果没有显式编码,它将无法正常工作。

答案 1 :(得分:2)

您不需要为base的构造函数的每个重载提供构造函数。你只需要一个。如果你的基础构造函数提供了一个默认的(无参数)构造函数,那么你甚至不需要自己提供构造函数。编译器将自动为您的类生成一个默认构造函数,它自动调用基类的默认构造函数。

注意:没有必要直接调用super(),因为它没有参数。只有在没有默认构造函数时才需要它。

看到许多不同的构造函数,以及你不需要它们的事实可能暗示父类做得太多了。

答案 2 :(得分:1)

你可以拥有这样的代码:

public class SuperClass {
public SuperClass() {
...
}
public SuperClass(double d) {
...
}
public SuperClass(BigDecimal b) {

}
public SuperClass(BigDecimal b, String s) {
this(b);
}
[...]
}

并有一个子类:

public class SubClass extends SuperClass{
public SubClass() {
super();
}
public SubClass(double d) {
super(d);
}

public SuperClass(BigDecimal b, String s) {
super(b, s);
}
[...]
}

答案 3 :(得分:1)

如果你想要父类和子类中的每种类型的构造函数,那么是的,你需要明确指定它们,但不需要显式调用super()