日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Kotlin 初始化陷阱。初始化注意事項(xiàng)

作者:安果移不動(dòng) 更新時(shí)間: 2022-05-12 編程語(yǔ)言

?一 注意屬性與init中的調(diào)用順序

class Player6() {

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


}

fun main() {

}

像java的靜態(tài)代碼塊。和成員變量的順序是可以這樣的

但是在kotlin中不行。因?yàn)镵otlin是根據(jù)代碼順序進(jìn)行初始化的

編譯成字節(jié)碼就會(huì)是這樣

?順便證明了。init的執(zhí)行地方是構(gòu)造方法初始化后。。

可行的初始化為如此

class Player6() {
    val blood = 100;

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


}

fun main() {

}

反編譯字節(jié)碼如下

?陷阱二

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

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


}

fun main() {
    Player7()
}

?這個(gè)沒(méi)啥好說(shuō)的有一看就看出來(lái)

陷阱3

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

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

這個(gè)也很明顯?

賦值的時(shí)候他本身就是null

?可以看字節(jié)碼他是如何運(yùn)行的

?先執(zhí)行方法 執(zhí)行的時(shí)候他是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上面就沒(méi)有這樣的問(wèn)題。所以kotlin需要注意這些

原文鏈接:https://blog.csdn.net/mp624183768/article/details/123876258

欄目分類
最近更新