Страницы

Поиск по вопросам

вторник, 5 марта 2019 г.

Вызов приватного конструктора родителя при наследовании

Почему я в данной ситуации могу унаследоваться от класса B? Ведь у класса B единственный конструктор, и тот закрытый.
public class Test { class B { private B() { } }
class C extends B { } }
class App { public static void main(String[] args) { Test.C b = new Test().new C(); } }
Несмотря на это я, как видите, могу создавать объекты класса С. Сразу скажу, что приватные методы и поля класса B класс-наследник С не видит, но каким-то образом видит приватный конструктор.
При этом не важно, имеют ли внутренние классы модификатор static или нет. Работает и так, и так.


Ответ

Дело в том, что классы C и B объявлены как внутренние классы в Test. Поэтому класс C вполне себе имеет доступ к приватному конструктору B, равно как и к private-методам B. Например, этот код прекрасно работает:
class B { private B() { }
private void print() { System.out.println("B print"); } }
class C extends B { public void print() { super.print(); } }
Если же эту "связь" между классами B и C убрать, например, разнеся их по разным файлам:
B.java
public class B { private B() { } }
C.java
public class C extends B { }
То возникнет ошибка компиляции:
error: B() has private access in B public class C extends B { }
Всё сводится к тому, что ошибка возникает только в случае, при котором в классе-наследнике нет возможности получить доступ ни к одному из конструкторов родителя. В вашем же случае такая возможность есть.

Комментариев нет:

Отправить комментарий