Java 嵌套类中私有构造函数的作用域

Java 嵌套类中私有构造函数的作用域,java,inheritance,constructor,superclass,Java,Inheritance,Constructor,Superclass,这与其说是个问题,不如说是个谜。我有以下代码: public class PrivateBaseConstructor { public static class BaseClass { private BaseClass() { } } public static class DerivedClass extends BaseClass { public DerivedClass() { sup

这与其说是个问题,不如说是个谜。我有以下代码:

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

    }

    public static class DerivedClass extends BaseClass {
        public DerivedClass() {
            super(); // 1*
        }
    }
}
这里是对
super()的调用private
,也允许使用code>at 1*。如果我们将这些类作为单独的类写入同一个包中:

BClass.java
public class BClass {
    private BClass() {

    }
}

DClass.java
public class DClass extends BClass {
    public DClass() {
        super(); // 2*
    }
由于基类构造函数不可见,编译器正确地在2*处给出了一个错误


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

,因为类中声明的任何内容都可以访问其私有成员,包括内部类。但是,如果在类上运行,您会发现它建议您将构造函数的可见性更改为非私有。

因为嵌套类可以看到彼此的成员。这与静态声明无关。请参见下面的代码示例,其中只包含嵌套的内部类(不是静态的)


在此处阅读有关嵌套类的更多信息:

如果成员或构造函数声明为私有,则仅当访问发生在包含成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问

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();
    }
}