Что выведет код Middle Классы, data и sealed обновлено

Порядок инициализации свойств и init

Вопрос

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

class Demo(val a: Int) {
    val b = a * 2.also { println("b") }
    init { println("init1 b=$b") }
    val c = b + 1
    init { println("init2 c=$c") }
    constructor() : this(5) { println("secondary") }
}

fun main() {
    Demo()
}

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

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

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

Коротко

Код выведет: b, init1 b=10, init2 c=11, secondary. Инициализаторы свойств и блоки init выполняются в порядке объявления, как одна общая процедура первичного конструктора.

Что выведет

b
init1 b=10
init2 c=11
secondary

Разбор

Инициализаторы свойств и блоки init выполняются в порядке объявления, как одна общая процедура первичного конструктора. 2.also { } печатает b и возвращает 2, поэтому b = 10. Затем первый init, вычисление c, второй init. Тело вторичного конструктора выполняется последним, после делегирования в первичный.

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

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