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

2 Solutions collect form web for “Kotlin在声明之前初始化一个variables?”

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

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

  • 匕首2在Kotlin未解决的参考DaggerXXXSub
  • 使用vararg调用Java函数,而不是在Kotlin中编译
  • Int :: class.javaPrimitiveType.kotlin引用不等于Int :: class.javaObjectType.kotlin
  • android studio 3.0.1和kotlin v1.2.10-release-Studio3.0-1有问题
  • Kotlin kotlinClass.class.getName()不能返回包名,而只能返回简单的类名
  • 如何用FindBugs避免kotlin文件
  • Kotlin编译器是否始终保留字节码中的参数名称?
  • 我怎样才能从可观察到的价值
  • Kotlin language will be the best programming language for Android.