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是奇怪的…

  • Kotlin二级构造函数
  • Kotlin:二级构造函数参数中的“val”是不允许的
  • 如何在Kotlin中扩展android.widget.FrameLayout(RequiresApi 21,但是我需要使用minSdk 19)
  • Kotlin构造函数:小学和中学
  • 在kotlin中,如何使主构造函数的setter属性为private?
  • Kotlin:我如何避免构造函数中的代码重复?
  • 构造函数中的调用顺序是有保证的
  • 在构造函数中调用super并在Kotlin中分配一个字段?
  • 2 Solutions collect form web for “Kotlin在声明之前初始化一个variables?”

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

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

    Kotlin language will be the best programming language for Android.