为什么java中的抽象类需要受保护的构造函数

Sun*_*pta 5 java constructor abstract-class protected

在查看java代码时,我发现抽象类的构造函数被设置为受保护的。

public abstract class A {
   protected A() {

   }
}
Run Code Online (Sandbox Code Playgroud)

什么

抽象对我来说意味着你不能创建此类的实例并在扩展后使用此类

受保护的构造函数也确保了这一点。

做两件事有什么意义,一是使构造函数受保护,二是使类抽象以解决相同的目的。

Era*_*ran 5

创建构造函数protected不会阻止同一包中的其他类或扩展此类的其他类使用此构造函数实例化该类。因此abstract需要关键字来防止实例化。

abstract你可以将一个类的构造函数声明为public,但是你仍然无法实例化这个类,所以这是没有意义的。另一方面,private构造函数不能被类的子类使用abstract(只能是类本身的其他构造函数abstract)。因此,该类abstract的所有子类都可以使用的该类的任何构造函数都abstract应该是protected.

当然,在您的特定示例中,根本不需要声明构造函数,因为它有一个空主体并且没有其他构造函数。这意味着编译器无论如何都会生成一个带有空主体的无参数构造函数。


ern*_*t_k 4

确实,降低抽象类中构造函数的可见性(从publicprotected)不会改变代码无法直接实例化抽象类的情况。

然而,这不是重点。一种方法是让构造函数protected仅用于控制范围,就像将成员属性设为私有一样。

这是同一类的修改版本,表明重点不是阻止实例化:

public abstract class A {
    protected A() {
        this(0);
    }
    private A(int a) {
        // not accessible to anyone but members of A
        // the point is not to prevent instantiation, but to restrict access
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使构造函数受保护是为了防止实例化,那么有人可能会认为在抽象类本身或其子类中实例化是可能的。