Котлин инициализирует переменную перед ее объявлением?

Вот мой тестовый код:

class Test {
    init {
        a = 1
    }

    constructor() {
        a = 2
    }

    private var a: Int

    init {
        a = 3
    }
}

Если я удалю вторичный конструктор:

class Test {
    init {
        a = 1 // Error: Variable cannot be initialized before declaration
    }

//    constructor() {
//        a = 2
//    }

    private var a: Int

    init {
        a = 3
    }
}

Я знаю, что

Во время инициализации экземпляра блоки инициализатора выполняются в том же порядке, что и в классе.

Но почему я могу инициализировать переменную перед ее объявлением, если есть вторичный конструктор?


Update:

И я нашел интересную вещь:

class Test {
    init {
        a = log(1)
    }

    constructor() {
        a = log(2)
    }

    private var a: Int = log(0)

    init {
        a = log(3)
    }
}

fun log(i: Int): Int {
    println(i)
    return i
}

fun main(args: Array<String>) {
    Test()
}

Вывод: 1 0 3 2, это то же самое, что и Java, объявление и инициализация - это два разных шага, но это странно для основного конструктора Котлина, Er...

Ответы

Ответ 1

Ваш пример выглядит как незначительная несогласованность. Это вызвано тем фактом, что первый пример не имеет первичного конструктора, а второй - один. Однако https://youtrack.jetbrains.com/issue/KT-22317 был создан.