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)
任何人都可以帮助我了解这里发生了什么吗?
有一个微妙之处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,当它们都嵌套在同一个顶级类中时,它可以做到这一点,但不是除此以外。