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节);如果该类被声明为受保护的,则默认构造函数将隐式给予访问修饰符保护(第6.6节);如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有(第6.6节);否则,默认构造函数具有无访问修饰符暗含的默认访问权限。

因此,在这种情况下,构造函数是隐式的protected

以上是 Java中默认构造函数的访问修饰符是什么? 的全部内容, 来源链接: utcz.com/qa/401646.html

回到顶部