为啥Java抽象类中需要受保护的构造函数

Posted

技术标签:

【中文标题】为啥Java抽象类中需要受保护的构造函数【英文标题】:Why is the need of Protected constructor in Abstract class in java为什么Java抽象类中需要受保护的构造函数 【发布时间】:2019-11-18 17:50:17 【问题描述】:

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

public abstract class A 
   protected A() 

   

什么

对我来说,抽象意味着你不能创建 this 的实例 类和扩展后使用这个类

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

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

【问题讨论】:

受保护的构造函数可以被子类或同一个包中的类调用。 为什么没有为您的抽象类提供受保护的构造函数?以某种方式声明它public 更可取,即使它具有误导性? @SudhirOjha 类在同一个包中?! 【参考方案1】:

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

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

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

【讨论】:

【参考方案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
    

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

【讨论】:

以上是关于为啥Java抽象类中需要受保护的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥受保护的构造函数会在此代码中引发错误?

为啥抽象类的构造函数应该受到保护,而不是公开的?

C++:为啥我的 DerivedClass 的构造函数无法访问 BaseClass 的受保护字段?

为啥不能将继承的受保护构造函数公开?

将 make_shared 与受保护的构造函数 + 抽象接口一起使用

抽象类的受保护与公共构造函数?有区别吗?