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