Каков порядок распечатки НОВОГО ключевого слова в наследовании?
Это на самом деле часть одного из интервью, которое я запутался.
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");
}