一 注意属性与init中的调用顺序
class Player6() {
init {
val bloodBonus = blood.times(4)
}
val blood = 100;
}
fun main() {
}
像java的静态代码块。和成员变量的顺序是可以这样的
但是在kotlin中不行。因为Kotlin是根据代码顺序进行初始化的
编译成字节码就会是这样
顺便证明了。init的执行地方是构造方法初始化后。。
可行的初始化为如此
class Player6() {
val blood = 100;
init {
val bloodBonus = blood.times(4)
}
}
fun main() {
}
反编译字节码如下
陷阱二
class Player7() {
val name: String
private fun firstLetter() = name[0];
init {
println(firstLetter())
name = "Jack";
}
}
fun main() {
Player7()
}
这个没啥好说的有一看就看出来
陷阱3
class Player8(_name: String) {
val palyerName: String = initPlayerName()
val name: String = _name;
private fun initPlayerName() = name;
}
fun main() {
println(Player8("Jack").palyerName)
}
这个也很明显
赋值的时候他本身就是null
可以看字节码他是如何运行的
先执行方法 执行的时候他是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需要注意这些