Java 私有构造函数可见性
2022-09-01 11:01:17
我试图理解为什么在谈论构造函数时类成员的可访问性之间存在差异。
请考虑以下示例:
class A {
static class B {
private B(String s) {}
private void foo() {}
}
static class C extends B {
public C(String s) {
super(s); // call B(String), which is private, and obviously accessible
}
void bar() {
foo(); // compilation error (symbol unknown), as B.foo() is private
}
}
}
的私有成员作为私有成员,不应从 进行访问。对于字段和方法,情况就是这样,但构造函数似乎不遵循相同的规则。A
B
来自 JLS-8 (6.6.1.确定可访问性),我们可以阅读:
[...]
仅当引用类型的成员(类、接口、字段或方法)或类类型的构造函数可访问并且成员或构造函数声明为允许访问时,才能访问该类型:
[...]
否则,将声明成员或构造函数,并且当且仅当访问发生在包含成员或构造函数声明的顶级类 (§7.6) 的主体中时,才允许访问。
private
谁能解释一下为什么构造函数可以从 访问,即使在声明时也是如此?C
private