Java和Kotlin類的初始化順序

Java

Java程序初始化的順序:父類靜態(tài)變量 -> 父類靜態(tài)代碼塊 -> 子類靜態(tài)變量 -> 子類靜態(tài)代碼塊 -> 父類非靜態(tài)變量 -> 父類非靜態(tài)代碼塊 -> 父類構(gòu)造器 -> 子類非靜態(tài)變量 -> 子類非靜態(tài)代碼塊 -> 子類構(gòu)造器。

Java程序初始化一般遵循3個原則:

  1. 靜態(tài)對象(變量)先于非靜態(tài)對象(變量)初始化。其中靜態(tài)對象(變量)只初始化一次,因為static在jvm中只有一塊區(qū)域存儲,方法區(qū)(Method Area),
    他之所以被稱為靜態(tài)是因為從程序創(chuàng)建到死亡他的地址值都不會改變,他只在class類對象初次加載時初始化,因此static只需要初始化一次,而非靜態(tài)對象(變量)可能會初始化很多次。
  2. 如果類之間存在繼承關(guān)系,那么父類優(yōu)先于子類進行初始化。
  3. 按照成員變量的定義順序進行初始化。即使變量定義散布于方法之中,他們依然在任何方法(包括構(gòu)造函數(shù))被調(diào)用前先初始化

Kotlin

init關(guān)鍵字==>java方法塊
companion object伴生對象==>java靜態(tài)方法,伴生對象中的init方法==>java靜態(tài)代碼塊

internal open class ClassLoaderA {
    init {
        print("2")
    }
    init {
        print("3")
    }
    constructor() {
        print("5")
    }
    constructor(name: String) : this() {
        print("6")
    }
    constructor(name: String, id: String) {
        print("7")
    }
    open fun print() {
        print("4")
    }
    companion object {
        init {
            print("1")
        }
    }
}

internal class ClassLoaderB : ClassLoaderA("s") {
    init {
        print("b")
    }
    init {
        print("c")
    }
    override fun print() {
        print("d")
    }
    companion object {
        init {
            print("a")
        }
    }
}

object Hello {
    @JvmStatic
    fun main(args: Array<String>) {
        var classLoaderB: ClassLoaderA = ClassLoaderB()
        classLoaderB.print()
        println()
        classLoaderB = ClassLoaderB()
    }
//結(jié)果輸出
1a2356bcd
2356bc
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容