在主程式建立相關類時,看看類的各個成員的先後呼叫情況,首先說下沒有繼承其他類的情況:
class
program
class
testclass1
static
testclass1()
}//用於測試成員變數的初始化情況
class
testclass2
}}
程式執行結果:
可以看出,當例項物件的類沒有父類的情況下(變數與常量的初始化順序與書寫順序有關,寫在前面就先初始化),成員初始化順序為:
靜態成員變數常量
靜態建構函式
例項成員變數常量
例項建構函式
下面看看若存在繼承類的情況:
static
void
main
(string
args)
class
testclass1
:baseclass
static
testclass1()
}class
baseclass
static
baseclass()
}//用於測試成員變數的初始化情況
class
testclass2
}
檢視執行結果,會發現存在明顯的差異,子類例項建構函式在父類例項構造函式呼叫後才呼叫:
可以看出,當例項物件的類存在父類的情況下,初始化各成員以及建構函式初始化順序存在了明顯差異,子類的例項建構函式會在父類例項構造函式呼叫之後執行,初始化順序為:
子類靜態成員變數
子類靜態建構函式
子類例項成員變數
父類靜態成員變數
父類靜態建構函式
父類例項成員變數
父類例項建構函式
子類例項建構函式
接下來再看看多重繼承的情況,主函式例項化孫子類:
static
void
main
(string
args)
class
testclass1
:baseclass
static
testclass1()
}class
testclass1_1
:testclass1
static
testclass1_1()
}class
baseclass
static
baseclass()
}//用於測試成員變數的初始化情況
class
testclass2
}
看看執行結果:
以上情況基本可以確定類的初始化規則為:
靜態成員變數常量-靜態建構函式-例項成員變數常量
存在父類則以上面的規則順序繼續初始化父類成員,直到沒有繼承類為止
然後以頂級類的例項建構函式往下一一呼叫,多次例項化則靜態成員和靜態建構函式不再參與
類的初始化順序詳解
先宣告乙個常識,類域和區域性變數初始化的差異如下,區域性變數不初始化會報錯 類中屬性 也稱域 不賦初值,預設為0,如果是引用預設為空。我們宣告乙個child類,擁有兩個構造方法 我們在main類中建立child的兩個物件 輸出結果 結論 就算類中屬性散亂定義在不同地方,初始化也會嚴格按照先後順序執行...
c 類的初始化順序
本文 c 類的初始化順序 類在初始化時的執行順序,依次如下 1 子類靜態變數 2 子類靜態建構函式 3 子類非靜態變數 4 父類靜態變數 5 父類靜態建構函式 6 父類非靜態變數 7 父類建構函式 8 子類建構函式 對於靜態變數與靜態建構函式而言,無論對乙個類建立多少個例項,它的靜態成員都只有乙個副...
類初始化順序
類初始化時,jvm會先初始化所有 1,靜態屬性,靜態例項,靜態塊。2.新建例項 靜態或非靜態 時會先執行所有非靜態屬性和構造塊 非靜態屬性和構造塊執行級別相同,誰前誰先 然後構造方法。注意 1 靜態 塊不能存在於任何方法體內。2 靜態 塊不能直接訪問靜態例項變數和例項方法,需要通過類的例項物件來訪問...