Java
Java程序初始化的順序:父類靜態(tài)變量 -> 父類靜態(tài)代碼塊 -> 子類靜態(tài)變量 -> 子類靜態(tài)代碼塊 -> 父類非靜態(tài)變量 -> 父類非靜態(tài)代碼塊 -> 父類構(gòu)造器 -> 子類非靜態(tài)變量 -> 子類非靜態(tài)代碼塊 -> 子類構(gòu)造器。
Java程序初始化一般遵循3個原則:
- 靜態(tài)對象(變量)先于非靜態(tài)對象(變量)初始化。其中靜態(tài)對象(變量)只初始化一次,因為static在jvm中只有一塊區(qū)域存儲,方法區(qū)(Method Area),
他之所以被稱為靜態(tài)是因為從程序創(chuàng)建到死亡他的地址值都不會改變,他只在class類對象初次加載時初始化,因此static只需要初始化一次,而非靜態(tài)對象(變量)可能會初始化很多次。 - 如果類之間存在繼承關(guān)系,那么父類優(yōu)先于子類進行初始化。
- 按照成員變量的定義順序進行初始化。即使變量定義散布于方法之中,他們依然在任何方法(包括構(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