我们都知道,如果我们没有专门定义构造函数,编译器会插入一个不可见的零参数构造函数。我认为它的访问修饰符是公开的,但在处理内部类问题时,我发现也许我错了。这是我的代码:
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
类添加公共构造函数,则会解决该错误。这就是为什么我认为默认构造函数的修饰符不公开!那么有谁能告诉我默认构造函数的访问修饰符是什么?
答案 0 :(得分:46)
我认为它的访问修饰符是公开的,但是当我处理内部类问题时,我发现也许我错了。
烨。实际上,几年前我发现自己处于同样的境地。我对一个错误感到惊讶(通过Guice注入,这让它稍微难以找到)。
关键是检查规范,在本例中为section 8.8.9:
在类类型中,如果该类声明为public,则默认构造函数被隐式赋予访问修饰符public(§6.6);如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected(§6.6);如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private(§6.6);否则,默认构造函数具有默认访问权限隐含的默认访问权限。
所以在这种情况下,你的构造函数是隐式protected
。
答案 1 :(得分:1)
答案 2 :(得分:1)
我想指出我最近得到的一件事。 如果为类定义默认构造函数,那么它的acess说明符将是您指定的。例如,
public class A{
A(){
// do some stuff
}
}
这里默认构造函数的访问说明符是包访问而不是公共访问(类的访问说明符)。 然而
public class A{
// no constructor is defined
}
这里编译器会同情你并给你一个默认构造函数,其访问说明符与类相同,即public。