Полиморфизм и конструкторы
Я студент AP Java, и я тренируюсь для своего экзамена. Я наткнулся на этот вопрос, и я не понимаю ответа:
Рассмотрим следующие классы:
public class A
{
public A() { methodOne(); }
public void methodOne() { System.out.print("A"); }
}
public class B extends A
{
public B() { System.out.print("*"); }
public void methodOne() { System.out.print("B"); }
}
Что такое вывод, когда выполняется следующий код:
A obj = new B();
Правильный ответ - B *. Может кто-нибудь объяснить мне последовательность вызовов методов?
Ответы
Ответ 1
Вызывается конструктор B. Первая неявная инструкция конструктора B super()
(вызов конструктора по умолчанию суперкласса). Таким образом вызывается конструктор. Конструктор вызывает super()
, который вызывает конструктор java.lang.Object, который ничего не печатает. Тогда вызывается methodOne()
. Поскольку объект имеет тип B, вызывается версия B methodOne
и печатается B
. Затем конструктор B продолжает выполнение, и печатается *
.
Следует отметить, что вызов переопределяемого метода из конструктора (например, конструктор A) является очень плохой практикой: он вызывает метод для объекта, который еще не сконструирован.
Ответ 2
Базовый класс должен быть создан до производного класса.
Сначала вызывается A()
, который вызывает methodOne()
, который печатает B
.
Далее вызывается B()
, который печатает *
.