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