Полиморфизм и конструкторы

Я студент 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(), который печатает *.