为什么 java 中的 Abstract class 中需要 Protected 构造函数

Why is the need of Protected constructor in Abstract class in java

在查看 java 代码时,我发现抽象 class 的构造函数受到保护。

public abstract class A {
   protected A() {

   }
}

什么

Abstract means to me is that you can't create the instance of this class and use this class after extending

And protected constructor also ensures that.

做两件事的意义何在,一是让构造函数受保护,二是为了解决相同的目的而制作 class 抽象。

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

你可以把一个abstractclass的构造函数声明为public,但是你仍然不能实例化这个class,所以这是没有意义的。另一方面,您的 abstract class 的 sub-classes 将无法使用 private 构造函数(只有 abstract [=29= 的其他构造函数] 本身)。因此,abstract class 的任何构造函数应该对 abstract class 的所有 sub-classes 可用,应该是 protected.

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

的确,减少构造函数在抽象 class 中的可见性(从 publicprotected)对于代码无法直接实例化抽象 class.

然而,这不是重点。一种构造函数 protected 只是为了控制作用域,就像将成员属性设为私有一样。

这里是相同的 class 的修改版本,表明重点不是防止实例化:

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

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