Выбор ответа Senior Основы: типы, обёртки, static обновлено

Переопределённый метод в конструкторе родителя

Вопрос

Что выведет new Child();?

class Parent {
    Parent() { print(); }
    void print() { System.out.println("parent"); }
}
class Child extends Parent {
    private String name = "child";
    @Override void print() { System.out.println(name); }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: null. Конструктор Parent выполняется до инициализаторов полей Child.

Варианты ответа

  1. nullправильный ответ
  2. child
  3. Пустую строку
  4. NullPointerException

Разбор

Конструктор Parent выполняется до инициализаторов полей Child. Он вызывает print(), а это переопределённый метод Child (динамическая диспетчеризация работает уже в конструкторе). Поле name ещё не проинициализировано и равно null, печатается null. NPE нет: конкатенации и println с null не падают. Поэтому из конструктора не вызывают переопределяемые методы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.