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


问题内容

这更多的是 困惑而 不是问题。我有以下代码:

public class PrivateBaseConstructor {
    public static class BaseClass {
        private BaseClass() {
        }

    }

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

super();即使基类构造函数为,在这里也允许对1 * 的调用private。如果我们在同一包中将这些类编写为单独的类:

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