什么是java中默认构造函数的访问修饰符?

我们都知道,如果我们没有专门定义构造函数,编译器会插入一个不可见的零参数构造函数。 我认为它的访问修饰符是公开的,但在处理内部类问题时,我发现也许我错了。 这是我的代码:

public class Outer { protected class ProtectedInner { // adding a public constructor will solve the error in SubOuterInAnotherPackage class //public ProtectedInner() {} } } 

在另一个包中有一个Outer的子类:

 public class SubOuterInAnotherPackage extends Outer { public static void main(String[] args) { SubOuterInAnotherPackage.ProtectedInner protectedInner = new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can't access the default constructor } } 

您将在main()方法中收到错误,但是如果向ProtectedInner类添加公共构造函数,则会解决该错误。 这就是为什么我认为默认构造函数的修饰符不公开! 那么有谁能告诉我默认构造函数的访问修饰符是什么?

我认为它的访问修饰符是公开的,但是当我处理内部类问题时,我发现也许我错了。

对。 实际上,几年前我发现自己处于同样的境地。 我对一个错误感到惊讶(通过Guice注入,这让它稍微难以找到)。

关键是检查规范,在本例中是8.8.9节 :

在类类型中,如果该类被声明为public,则默认构造函数被隐式赋予访问修饰符public(§6.6); 如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected(§6.6); 如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private(§6.6); 否则,默认构造函数具有无访问修饰符隐含的默认访问权限。

所以在这种情况下,构造函数是隐式protected

除了Jon很好地陈述的内容之外,这里还有一个图像示例,对于视觉人来说。

如果类中没有构造函数,编译器会自动创建默认构造函数。

以下是成功描述上述规则的示例:

在此处输入图像描述

如需进一步参考,请参阅此处 。

我想指出我最近得到的一件事。 如果为类定义默认构造函数,那么它的acess说明符将是您指定的。 例如,

  public class A{ A(){ // do some stuff } } 

这里默认构造函数的访问说明符是包访问而不是公共访问(类的访问说明符)。 然而

  public class A{ // no constructor is defined } 

在这里,编译器会同情你并给你一个默认构造函数,其访问说明符与类相同,即public。