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

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

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 } } 

я знаю это

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

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


Обновить:

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

 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 …

Intereting Posts
Котлин. Какое использование класса без тела? Неразрешенная ссылка: Kotlin нуждается в 2 сборках после очистки, чтобы получить код при использовании kapt Как запросить Realm в фоновом потоке с помощью RxJava2 Ошибка компилятора Kotlin в Raspberrypi2 Jooq-транзакции: соединения не выводятся в пул, если исключение выбрано в транзакции Как инициализировать контрольную переменную в Котлине Как избежать избыточной нулевой проверки (предупреждение FindBugs) в поле Котлин переменная вызова can not в студии android Файлы Kotlin не могут использовать R.java Вызов функции в фрагменте представления пейджера из активности Ссылка Int :: class.javaPrimitiveType.kotlin не равна Int :: class.javaObjectType.kotlin Как найти, какой элемент не удалось сравнить между массивами в Котлине? Завод Котлин на внутреннем вложенном классе Уведомлять наблюдателя, когда элемент добавлен в список LiveData Kotlin: Что такое файл kjsm?