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

2022-09-01 10:38:17

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

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


答案 1

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

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

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

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

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


答案 2

除了Jon说得很好之外,这里还有一个图像示例,供视觉人士使用。

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

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

enter image description here

有关进一步的参考,请参阅此处


推荐