Kotlin在声明之前初始化一个variables?

这是我的测试代码:

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

我知道

在实例初始化期间,初始化块将按照它们在类体中出现的顺序执行。

但是,为什么我可以在它的声明前初始化variables,如果有第二个构造函数?


更新:

我发现一个有趣的事情:

 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) { Test() } 

输出是: 1 0 3 2 ,这与Java相同,声明和初始化是两个不同的步骤,但是对于Kotlin的主要构造函数Er是奇怪的…

你的例子看起来很小的不一致。 第一个例子没有主要的构造函数,但是第二个例子有一个。 但是, https://youtrack.jetbrains.com/issue/KT-22317已创建。

从我的观点来看,它并不涉及kotlin,而是JVM字节码,它实际上并没有对variables进行“初始化”,只是将它们填充到构造函数中,您可以使用一些反编译器来检查它。