为什么在Java抽象类中需要Protected构造函数

时间:2019-07-09 08:07:31

标签: java constructor abstract-class protected

在查看Java代码时,我已经看到抽象类的构造函数受到保护。

public abstract class A {
   protected A() {

   }
}

什么

  

摘要对我来说意味着您无法创建此实例   类,并在扩展后使用该类

  

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

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

2 个答案:

答案 0 :(得分:2)

确实,减少构造函数在抽象类(从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
    }
}

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

答案 1 :(得分:1)

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

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

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