[英]scope of private constructor in Nested Class
这与其说是问题,不如说是一个谜题。 我有以下代码:
public class PrivateBaseConstructor {
public static class BaseClass {
private BaseClass() {
}
}
public static class DerivedClass extends BaseClass {
public DerivedClass() {
super(); // 1*
}
}
}
这里调用super();
即使基类构造函数是private
也允许 at 1* 。 如果我们将类编写为同一个包中的单独类:
BClass.java
public class BClass {
private BClass() {
}
}
DClass.java
public class DClass extends BClass {
public DClass() {
super(); // 2*
}
编译器正确地在 2* 处给出错误,因为基类构造函数不可见。
当两个类在一个类中都声明为静态时,为什么编译器不会在我的第一个场景中抛出错误?
如果成员或构造函数被声明为私有,则当且仅当它发生在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时,才允许访问。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1
因为嵌套类可以看到彼此的成员。 这与静态声明无关。 请参阅以下仅包含嵌套内部类(非静态)的代码示例。
public class PrivateBaseConstructor {
public class BaseClass {
private BaseClass() {}
}
public class DerivedClass extends BaseClass {
public DerivedClass() {
super(); // 1*
}
}
public static void main(String[] args)
{
new PrivateBaseConstructor(). new DerivedClass();
}
}
在此处阅读有关嵌套类的更多信息: http : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html
因为在类中声明的任何东西都可以访问其私有成员,包括内部类。 但是,如果您在类上运行PMD ,您会发现它建议您将构造函数的可见性更改为非私有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.