繁体   English   中英

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

[英]Private constructor of static inner classes in Java

我是 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");
        }
    }
}

虽然这不是:

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
    }
}

谁能帮我理解这里发生了什么?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM