【问题标题】:Private constructor of static inner classes in JavaJava中静态内部类的私有构造函数
【发布时间】:2020-01-23 16:26:42
【问题描述】:

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

简而言之:

这行得通:

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的类:我认为这不太准确。它应该是...没有子类可以访问的构造函数。在这种情况下(工作代码),C 可以访问 private 的成员 B

标签: java inheritance constructor static


【解决方案1】:

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 中的无参数构造函数,当它们都嵌套在相同的顶级类,但不是其他的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2013-02-18
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多