C 類的初始化順序詳解

2021-10-19 12:38:17 字數 1814 閱讀 2077

在主程式建立相關類時,看看類的各個成員的先後呼叫情況,首先說下沒有繼承其他類的情況:

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 靜態 塊不能直接訪問靜態例項變數和例項方法,需要通過類的例項物件來訪問...