协慌网

登录 贡献 社区

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

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

如果是这样,它将如何使用以及用于什么目的?

答案

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

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

超类Product是抽象的,并且具有构造函数。具体类TimesTwo有一个构造函数,仅仅在硬编码值 2 的具体类TimesWhat有一个构造函数允许调用方指定的值。

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

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

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

  • 您想要在实际实例化子类之前执行一些初始化(到抽象类的字段)
  • 您已经在抽象类中定义了 final 字段,但是没有在声明本身中对其进行初始化;在这种情况下,您必须具有构造函数来初始化这些字段

注意:

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

无论如何,请不要忘记,如果您未定义构造函数,则编译器会自动为您生成一个(此构造函数是公共的,没有参数,并且不执行任何操作)。

是的,它可以具有构造函数,并且已定义并且其行为与其他任何类的构造函数一样。除了不能直接实例化抽象类,只能对其进行扩展,因此,其使用总是来自子类的构造函数。