Intereting Posts
rxjava2 – простой пример выполнения задач в пуле потоков, подписывается на один поток Kotlin: JsonProperty.Access.READ_ONLY по классу данных Создайте новый список из двух других списков разных типов, сравнивая значения каждого типа Канал выхода из вентилятора / вентилятора в закрытии Firebase-firestore не может использовать два документа TestScheduler не работает (Kotlin + RxJava2 + mockito) Метод Kotlin inline не видим, если не расширять класс Внедрение интерфейса с параметризованной функцией Как Kotlin взаимодействует с Java и JavaScript? Конструктор Котлин с суперклассом Классы кинжалов отображаются как красные, но все еще строятся Kotlin lazy var throwing ClassCastException: kotlin.UNINITIALIZED_VALUE Является ли Котлин «передачей по значению» или «передачей по ссылке»? «Ошибка неоднозначности разрешения перегрузки» разрешена с другой перегрузкой Несколько значков желоба связанных файлов XML в Android Studio с Kotlin

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

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

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 …