添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接


一 注意属性与init中的调用顺序

class Player6() {

init {
val bloodBonus = blood.times(4)
}
val blood = 100;


}

fun main() {

}

像java的静态代码块。和成员变量的顺序是可以这样的

但是在kotlin中不行。因为Kotlin是根据代码顺序进行初始化的

Kotlin 初始化陷阱。初始化注意事项_初始化

编译成字节码就会是这样

Kotlin 初始化陷阱。初始化注意事项_字节码_02

顺便证明了。init的执行地方是构造方法初始化后。。

可行的初始化为如此

class Player6() {
val blood = 100;

init {
val bloodBonus = blood.times(4)
}


}

fun main() {

}

反编译字节码如下

Kotlin 初始化陷阱。初始化注意事项_kotlin_03

陷阱二

class Player7() {
val name: String
private fun firstLetter() = name[0];

init {
println(firstLetter())
name = "Jack";
}


}

fun main() {
Player7()
}

Kotlin 初始化陷阱。初始化注意事项_java_04

这个没啥好说的有一看就看出来

陷阱3

class Player8(_name: String) {
val palyerName: String = initPlayerName()
val name: String = _name;
private fun initPlayerName() = name;
}

fun main() {
println(Player8("Jack").palyerName)
}

Kotlin 初始化陷阱。初始化注意事项_kotlin_05

这个也很明显

赋值的时候他本身就是null

Kotlin 初始化陷阱。初始化注意事项_kotlin_06

可以看字节码他是如何运行的

Kotlin 初始化陷阱。初始化注意事项_kotlin_07

先执行方法 执行的时候他是null。所以最终返回null

正确写法呢

class Player8(_name: String) {
val name: String = _name;
val palyerName: String = initPlayerName()
private fun initPlayerName() = name;
}

fun main() {
println(Player8("Jack").palyerName)
}

放在java上面就没有这样的问题。所以kotlin需要注意这些