【发布时间】:2016-02-21 09:16:02
【问题描述】:
在谈到构造函数时,我试图理解为什么类成员的可访问性之间存在差异。
考虑以下示例:
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. Determining Accessibility),我们可以阅读:
[...]
引用类型的成员(类、接口、字段或方法)或类类型的构造函数,只有在该类型可访问并且声明成员或构造函数允许访问时才可访问:
[...]
否则,成员或构造函数被声明为
private,并且当且仅当它出现在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时才允许访问。
谁能解释一下为什么构造函数可以从C 访问,即使被声明为private?
【问题讨论】:
-
可以调用 super 并不意味着可以访问构造函数
-
谁能解释为什么构造函数可以从 C 访问,即使被声明为私有? -> 因为 B 和 C 都是 A 的内部类。如果将 B 和 C 移到 A 之外,将不再起作用。
-
@JörnBuitink:如果是这样,那为什么
foo()不可访问?这里似乎确实存在不一致。 -
请注意
super.foo()有效。 -
@Arun 那是 C#。不是Java。静态类在 Java 中可以有构造函数。
标签: java constructor private