Я пытаюсь понять, почему существует разница между доступностью членов класса, когда речь идет о конструкторах.
Рассмотрим следующий пример:
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. Определение доступности), мы можем прочитать:
[...]
Элемент (класс, интерфейс, поле или метод) ссылочного типа или конструктор типа класса доступен только в том случае, если тип доступен и член или конструктор объявлен для разрешения доступа:
[...]
В противном случае член или конструктор объявляется
private
, и доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня (§7.6), который включает объявление члена или конструктора.
Может ли кто-нибудь объяснить мне, почему конструктор доступен из C
, даже будучи объявленным private
?