#java
Почему я в данной ситуации могу унаследоваться от класса 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 или нет. Работает и так, и так.
Ответы
Ответ 1
Дело в том, что классы 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 { } Всё сводится к тому, что ошибка возникает только в случае, при котором в классе-наследнике нет возможности получить доступ ни к одному из конструкторов родителя. В вашем же случае такая возможность есть.
Комментариев нет:
Отправить комментарий