如何显式调用父类的构造函数

时间:2013-08-26 03:12:28

标签: java inheritance constructor

我想做以下事情:

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”相同的构造函数。因此,每次创建新的类似类时,我都不希望编写构造函数方法。

由于

2 个答案:

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