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

jas*_*son 30 java access-specifier

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

public class Outer {
  protected class ProtectedInner {
    // adding a public constructor will solve the error in SubOuterInAnotherPackage class
    //public ProtectedInner() {}
  }
}
Run Code Online (Sandbox Code Playgroud)

并且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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 47

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

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

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

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

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