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