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

什么';java中默认构造函数的访问修饰符是什么?,java,access-specifier,Java,Access Specifier,我们都知道,如果不专门定义构造函数,编译器就会插入一个不可见的零参数构造函数。我认为它的访问修饰符是公共的,但在处理一个内部类问题时,我发现可能我错了。这是我的密码: public class Outer { protected class ProtectedInner { // adding a public constructor will solve the error in SubOuterInAnotherPackage class //public Protect

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

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注入,这使得查找有点困难)

关键是检查规格,在这种情况下:

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

因此,在本例中,您的构造函数是隐式的
保护的

除了Jon非常清楚地陈述的内容之外,下面是一个图像示例,供视觉人员使用

若类中并没有构造函数,编译器会自动创建一个默认构造函数

下面是一个成功描述上述规则的示例:


进一步参考,请参考。

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

 public class A{
       A(){
       // do some stuff
       }
    }
这里,默认构造函数的访问说明符是包访问,而不是公共访问(类的访问)。 然而


在这里,编译器将同情您,并为您提供一个默认构造函数,其访问说明符将与类相同,即public。

谢谢,我忘记了规范,我只在教程中搜索,非常感谢提醒和分享!这让我抓狂:)因为在我为这个受保护的嵌套类声明显式公共构造函数之前,我可以访问嵌套类的类型,但不能访问构造函数。。本规范解释了发生的情况,,thnx定义一个无参数构造函数并将其称为默认构造函数是不对的。默认构造函数是由编译器生成的,当程序员提供无参数构造函数时,它与默认构造函数不同(即使它们的功能可以相同,以相同的名称调用它们仍然是不正确的。一个是由编译器提供的-默认,另一个是由程序员提供的自定义构造函数)。
 public class A{
       // no constructor is defined
    }