Каков порядок init и companion object в Kotlin?

Сначала выводится companion, затем init-1, init-2, secondary: 1, search. Для второго объекта повторяются init-1, init-2, secondary: 2, search, но не companion.

Короткий ответ

Что ответить на собеседовании

Сначала выводится companion, затем init-1, init-2, secondary: 1, search. Для второго объекта повторяются init-1, init-2, secondary: 2, search, но не companion.

Подробный разбор

Ответ с пояснениями

Условие

В Kotlin/JVM выполните main и определите порядок строк:

class Habr() {
    companion object { init { println("companion") } }
    init { println("init-1") }
    init { println("init-2") }
    constructor(n: Int) : this() { println("secondary: $n") }
    fun searchMagnit() { println("search") }
}
fun main() {
    Habr(1).searchMagnit()
    Habr(2).searchMagnit()
}

Ответ

Сначала выводится companion, затем init-1, init-2, secondary: 1, search. Для второго объекта повторяются init-1, init-2, secondary: 2, search, но не companion.

Companion относится к классу и инициализируется один раз. Каждый вторичный конструктор делегирует первичному: сначала выполняются init-блоки экземпляра в порядке объявления, затем тело вторичного конструктора. Метод searchMagnit вызывается только после успешного завершения создания соответствующего объекта. Порядок в этой задаче не связан с асинхронностью: main выполняет вызовы последовательно.

Источник: kotlinlang.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее