Java中静态内部类的私有构造函数

And*_*ott 4 java inheritance static constructor

我是 Java 新手,我发现我们不能将构造函数为private. 但是,我遇到了这段代码,它创建了一个子类,其超类的构造函数是私有的。

简而言之:

这有效:

class A {
    static class B {
        private B() {
            out.println("Constructor of B");
        }
    }

    static class C extends B {
        C() {
            out.println("Constructor of C");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这不会:

class B {
    private B() {
        out.println("Constructor of B");
    }
}

class C extends B {
    C() {
        out.println("Constructor of C"); // No default constructor available for super class
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我了解这里发生了什么吗?

Jon*_*eet 5

有一个微妙之处private,你可能还没有理解。从JLS 6.6 开始

否则,成员或构造函数被声明为私有,并且当且仅当它发生在包含成员或构造函数声明的顶级类型(第 7.6 节)的主体内时才允许访问。

所以暂时忘记继承,这意味着顶级类型中的所有代码,包括嵌套类型中的代码,都可以访问同一顶级类型中声明的所有私有成员,包括嵌套类型中声明的成员.

这是一个例子:

public class TopLevel {

    private static void foo() {
    }

    static class Nested1 {
        private static void bar() {
        }
    }

    static class Nested2 {
        private static void callFooBarFromNested() {
            foo();
            Nested1.bar();
        }
    }

    private static void callFooBarFromTopLevel() {
        foo();
        Nested1.bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

从那里开始,这只是了解为什么您的第一个示例很好的一小步 - 无参数构造函数 inC需要链接到 in 的无参数构造函数B,当它们都嵌套在同一个顶级类中时,它可以做到这一点,但不是除此以外。