我想做以下事情:
class P {
P(int a) {
// construct
}
}
class C extends P {
}
// in main
int a = 2;
C foo = new C(a); // can I do this?
我希望通过调用父类P的构造函数来创建子对象C,而无需在类C中编写任何构造函数,如“super(a)”。这可能吗?
我的想法是我有很多类,比如“C类”,它需要与“class P”相同的构造函数。因此,每次创建新的类似类时,我都不希望编写构造函数方法。
由于
答案 0 :(得分:3)
构造函数不是继承的。您需要在C
中声明一个带参数的构造函数。它需要调用适当的超类构造函数(如果你不想调用默认的超类构造函数)。
唯一可以避免声明的构造函数是default,no-arg构造函数,并且只有在声明没有构造函数时才会这样。那是因为如果你没有声明构造函数,编译器会为你生成一个。除非显式调用超类构造函数,否则编译器总是插入对默认超类构造函数的调用。
另请注意,如果未显式调用超类构造函数且超类中没有默认构造函数,则会出现编译时错误。
编辑:如果你有“像C类那样的很多类”,那么编写很多构造函数的另一种方法是使用factory method pattern。您可以让所有类实现默认构造函数,并提供一个单独的init()
方法,该方法采用一组标准参数。工厂方法将接受Class<? extends C>
对象和一些初始化参数,生成新实例(使用默认构造函数),并使用初始化参数调用其init
方法。这样,您只需要为需要特殊处理的子类覆盖init
方法(始终记得调用super.init
)。
答案 1 :(得分:3)
因此,在你的情况下,类C
有一个默认的构造函数,它会尝试隐式调用类P
的默认构造函数,它不会退出并会失败。
所以,你必须这样做
class P
{
public P(int a)
{
// construct
}
}
class C extends P
{
public C(int x)
{
super(x);
}
}