是否有充分的理由为抽象类的公共构造函数

Rae*_*ald 38 java constructor abstract-class

通过直接调用abstract类的构造函数来创建对象是不可能的.abstract只能从派生类中调用类的构造函数.因此,在我看来,抽象类的构造函数必须是或者是protected私有的(后者用于限制将构造函数用于包中的派生类的异常情况).然而,Java允许abstract类的构造函数public.

有没有在它是任何情况下有用申报的构造函数abstract的类要public,而不是protected或包专用?

这与" 抽象类构造函数访问修饰符 " 这个问题并不完全相同:显然你可以声明一个构造函数public; 我想知道是否有过任何好的理由这样做.在我看来,没有.我看到C#具有类似的特性.

And*_*s_D 19

java的答案是一样的:

对于抽象类而言,没有理由使用公共构造函数.我假设编译器没有抱怨的原因很简单,他们只是没有花时间来覆盖它,因为它是公共的还是受保护的并不重要.(来源)

您不能从直接子类以外的任何东西调用抽象类的构造函数.

因此,为抽象类的构造函数的访问修饰符添加一个特殊规则不会添加对该语言有用的东西.


有一件事看起来像这条规则的例外 - 如果抽象类只定义了默认构造函数,那么子类就不必实现构造函数:这是合法的:

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

public class B extends A {}
Run Code Online (Sandbox Code Playgroud)

所以我们可以B通过调用创建new B()- 但请注意,我们仍然 创建一个B而不是一个A.而且,同样,构造函数A是公共的还是受保护的并不重要.它不应该是私有的,但编译器会注意到并抱怨...

实际上我们调用一个"不可见"的公共默认构造函数,在B其上进行简单的super()调用...