Какой порядок инициализации переменных и выполнения блоков кода при создании экземпляра класса: companion object, init блок, переменная в конструкторе, обычная переменная

«Какой порядок инициализации переменных и выполнения блоков кода при создании экземпляра класса: companion object, init блок, переменная в конструкторе, обычная переменная» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Порядок инициализации:

  1. Companion object (если есть) - выполняется при первом обращении к классу
  2. Параметры конструктора (если передаются)
  3. Свойства класса (переменные) в порядке объявления
  4. init блоки в порядке их объявления
  5. Вторичные конструкторы (если есть)

Пример:

class Test(val param: String) {
    companion object { 
        init { println("1. Companion") }
    }

    val prop1 = "2. Property".also(::println)

    init { println("3. Init block") }

    val prop2 = "4. Property 2".also(::println)
}