我想知道我是否有一个带有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);
}
[...]
}
答案 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()
。