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

  • 当setter有返回值时,如何使用setter如obj.value =“”?
  • 如何使用自定义setter检查参数的有效性?
  • 为什么不在Kotlin的Android 4.x下运行应用程序?
  • 在库模块中使用Kotlin,而不在app模块中使用它
  • 导入和锯齿实践
  • 是否可以为参数函数定义一个默认值?
  • Kotlin,减少重复的代码
  • 在Kotlin中通配variables的通配符
  • 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.