嵌套类中私有构造函数的范围

这不仅仅是一个难题而不是问题。 我有以下代码:

public class PrivateBaseConstructor { public static class BaseClass { private BaseClass() { } } public static class DerivedClass extends BaseClass { public DerivedClass() { super(); // 1* } } } 

这里调用super(); 虽然基类构造函数是private但是1 *是允许的事件。 如果我们将类作为单独的类编写在同一个包中:

 BClass.java public class BClass { private BClass() { } } DClass.java public class DClass extends BClass { public DClass() { super(); // 2* } 

由于基类构造函数不可见,编译器在2 *处正确地给出了错误。

当两个类在一个类中声明为静态时,为什么编译器在我的第一个场景中不会抛出错误?

如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第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 ,您会发现它建议您将构造函数的可见性更改为非私有。