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

Статический метод и наследование

Вопрос

Что выведет код?

class A { static String name() { return "A"; } }
class B extends A { static String name() { return "B"; } }

A obj = new B();
System.out.println(obj.name());

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

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

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

Коротко

Правильный ответ: A. Статические методы не переопределяются, а скрываются.

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

  1. Aправильный ответ
  2. B
  3. Ошибка компиляции: статический метод нельзя объявлять в наследнике
  4. Ошибка компиляции: статический метод нельзя вызывать через ссылку на объект

Разбор

Статические методы не переопределяются, а скрываются. Какой вызвать, решает компилятор по объявленному типу переменной (A), а не по объекту. Поэтому A. Полиморфизм B был бы, если бы методы были экземплярными. Объявить статический метод с той же сигнатурой в наследнике можно (это и есть hiding). Вызов статического метода через ссылку компилируется, хотя IDE предупредит.

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

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