5

我想做以下事情:

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)”。那可能吗?

这个想法是我有很多像“class C”这样的类,它需要与“class P”相同的构造函数功能。所以我不想每次创建一个新的类似类时都写一个构造函数方法。

谢谢

4

2 回答 2

4
  • 构造函数隐式调用其直接超类的无参数构造函数(仅当没有显式调用时)
  • 当您定义自己的构造函数时,不会创建默认构造函数。

因此,在您的情况下, ClassC有一个默认构造函数,它将尝试隐式调用 Class 的默认构造函数,该构造函数P不会退出并且会失败。

所以,你必须这样做

class P 
{
    public P(int a) 
    {
    // construct
    }
}

class C extends P 
{
    public C(int x)
    {
       super(x);
    }
}
于 2013-08-26T03:18:57.160 回答
3

构造函数不被继承。您将需要声明一个C带有参数的构造函数。它将需要调用适当的超类构造函数(如果您不希望调用默认的超类构造函数)。

您可以避免声明的唯一构造函数是默认的、无参数的构造函数,并且只有在您不声明任何构造函数的情况下才会如此。那是因为如果你没有声明构造函数,编译器会为你生成一个。除非您显式调用超类构造函数,否则编译器始终会插入对默认超类构造函数的调用。

另请注意,如果您没有显式调用超类构造函数并且超类中没有默认构造函数,您将收到编译时错误。

编辑:如果您有“很多像 C 类这样的类”,那么编写大量构造函数的替代方法是使用工厂方法模式。您可以让所有类实现一个默认构造函数并提供一个单独的init()方法,该方法采用一组标准参数。工厂方法将接受一个Class<? extends C>对象和一些初始化参数,生成一个新实例(使用默认构造函数),并init使用初始化参数调用其方法。这样你只需要重写init那些需要特殊处理的子类的方法(总是记住调用 to super.init)。

于 2013-08-26T03:14:20.120 回答