[英]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.