Каков порядок распечатки НОВОГО ключевого слова в наследовании?

Это на самом деле часть одного из интервью, которое я запутался.

class A
{
   public A()
   {
        System.out.println("A") ;
    }
 }

 class B extends A
 {
     public B()
     {
         System.out.println("B") ;
     }
 }


 A a1 = new B();
 System.out.println() ;
 A a2 = (A) new B() ;

Итак, вопрос в том, что это за распечатка?

Сначала я думал, что это должно распечатать как

B
A

B
A

Но после того, как я бегу домой, это дает

A
B

A
B

Я понимаю, что это наследование, а затем преобразование B в A, и это также допустимый синтаксис, но почему A печатается перед B?

2 ответа

почему печать перед B?

Потому что тело конструктора суперкласса выполняется в основном перед телом конструктора подкласса.

Подумай о своем B() конструктор так же неявно:

public B()
{
    super(); // This invokes A's constructor
    System.out.println("B") ;
}

Полная информация в JLS 12.5. Особенно:

Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (используя this). Если этот конструктор предназначен для класса, отличного от Object, тогда этот конструктор начнется с явного или неявного вызова конструктора суперкласса (используя super). Оцените аргументы и обработайте этот вызов конструктора суперкласса рекурсивно, используя те же пять шагов.

Конструктор родительского класса A вызывается до того из подкласса B, Другими словами, это эквивалентно:

public B() {
    super();
    System.out.println("B");
}
Другие вопросы по тегам