Страницы

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

суббота, 11 января 2020 г.

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

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

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

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