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

为什么java中抽象类需要受保护的构造函数,java,constructor,abstract-class,protected,Java,Constructor,Abstract Class,Protected,在查看java代码时,我看到抽象类的构造函数受到保护 public abstract class A { protected A() { } } 什么 抽象对我来说意味着你不能创建这个 类,并在扩展后使用该类 而受保护的构造函数也确保了这一点 做两件事的意义是什么,一件是保护构造函数,另一件是抽象类以解决相同的问题。保护构造函数不会阻止来自相同包的其他类或扩展该类的其他类使用该构造函数实例化该类。因此,需要使用abstract关键字来防止实例化 您可以将抽象类的构造函数声明为公

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

public abstract class A {
   protected A() {

   }
}
什么

抽象对我来说意味着你不能创建这个 类,并在扩展后使用该类

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


做两件事的意义是什么,一件是保护构造函数,另一件是抽象类以解决相同的问题。

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

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


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

确实,降低抽象类中构造函数的可见性(从
public
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
    }
}

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

受保护的构造函数可以由子类或同一包中的类调用。为什么不为抽象类设置受保护的构造函数?在某种程度上,将其声明为
public
更可取吗?即使这会产生误导?@SudhirOjha类在同一个包中?!