Что выведет код Middle Dart: классы и миксины обновлено

Dart: порядок инициализации при наследовании

Вопрос

Что выведет программа? По строке на каждый вывод.

class Parent {
  Parent() {
    print('тело Parent');
  }
}

class Child extends Parent {
  final int x;
  Child(int v)
      : x = log('поле x', v),
        super() {
    print('тело Child $x');
  }
}

int log(String msg, int v) {
  print(msg);
  return v;
}

void main() {
  Child(5);
}

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

Напишите, что выведет код: каждый вывод с новой строки.

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

Коротко

Код выведет: поле x, тело Parent, тело Child 5. Сначала выполняется список инициализации Child (поле x), затем конструктор родителя целиком, и только потом тело конструктора Child.

Что выведет

поле x
тело Parent
тело Child 5

Разбор

Сначала выполняется список инициализации Child (поле x), затем конструктор родителя целиком, и только потом тело конструктора Child. Поэтому в теле родителя поля наследника уже инициализированы списком, а тело наследника выполняется последним.

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

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

Термины по теме