为什么我们不能在java中使用抽象构造函数?



我想知道java中的设计考虑因素是什么,阻止了这样的类?

public abstract class A{
    public abstract A();
}

如果我们可以强制实现构造函数,那么我们就可以实例化抽象类。但他们为什么不呢?这是否违反OOP设计,或者根本不可能?

抽象构造函数没有任何意义。

抽象方法强制所有具体的子类实现具有相同签名(包括相同名称)的方法。

但是,具体子类不能实现与抽象类的"抽象构造函数"同名的构造函数,因为构造函数必须具有它出现的类的名称。

抽象修饰符是为那些尚未给出实现的人准备的。

考虑到一种情况(就像你刚才问的那样),构造函数本身是抽象的,所以它的类创建实际上不可能发生。

为什么

若类存在,系统将自动调用其默认构造函数。但是现在,由于您已经提供了自己的构造函数(另外它是抽象的),默认的构造函数将不存在,因此这个类也不存在。

因此出现了不一致的情况。

希望能有所帮助。

您不能有一个抽象构造函数,因为抽象意味着您需要在子类中的某个时间点提供该构造函数的实现。但不能重写构造函数。拥有一个抽象构造函数是没有意义的:

  1. 由于构造函数需要与类的名称相同
  2. 您将始终调用子类的构造函数,而不是基类的构造函数类

抽象构造函数将没有任何意义,因为构造函数与特定类型的对象创建直接相关。此外,我们无法为给定类中的任何其他类定义构造函数。

但是,如果您仍然想强制执行这种模式,则需要使用抽象工厂模式

当您将构造函数设置为"abstract"时,实际上是在说:

这个构造函数没有主体,您希望在其他时间在子类中实现它

然而,构造函数是在创建Object时隐式调用的,所以我们不能实现构造函数,这就是为什么构造函数不是抽象的。

abstract class BaseClass {
  abstract BaseClass() // compile time error
}

最新更新