抽象类可以有构造函数吗?

2022-08-31 04:09:00

抽象类可以有构造函数吗?

如果是,如何利用它,用于什么目的?


答案 1

是的,抽象类可以具有构造函数。请考虑以下情况:

abstract class Product { 
    int multiplyBy;
    public Product( int multiplyBy ) {
        this.multiplyBy = multiplyBy;
    }

    public int mutiply(int val) {
       return multiplyBy * val;
    }
}

class TimesTwo extends Product {
    public TimesTwo() {
        super(2);
    }
}

class TimesWhat extends Product {
    public TimesWhat(int what) {
        super(what);
    }
}

超类是抽象的,并且具有构造函数。具体类有一个构造函数,该构造函数仅对值 2 进行硬编码。具体类具有一个构造函数,该构造函数允许调用方指定值。ProductTimesTwoTimesWhat

抽象构造函数将经常用于强制实施类约束或不变量,例如设置类所需的最小字段。

注意:由于父抽象类中没有默认(或无参数)构造函数,因此子类中使用的构造函数必须显式调用父构造函数。


答案 2

如果您处于以下情况之一,则可以在抽象类中定义构造函数:

  • 您希望在子类的实例化实际发生之前执行一些初始化(对抽象类的字段)
  • 你已经在抽象类中定义了最终字段,但你没有在声明本身中初始化它们;在这种情况下,您必须有一个构造函数来初始化这些字段

请注意:

  • 您可以定义多个构造函数(具有不同的参数)
  • 你可以(应该?)定义所有受保护的构造函数(无论如何,将它们公开是没有意义的)
  • 您的子类构造函数可以调用抽象类的一个构造函数;它甚至可能必须调用它(如果抽象类中没有no-arg构造函数)

无论如何,不要忘记,如果你没有定义一个构造函数,那么编译器将自动为你生成一个(这个是公共的,没有参数,也不做任何事情)。