先宣告乙個常識,類域和區域性變數初始化的差異如下,
區域性變數不初始化會報錯:
類中屬性(也稱域)不賦初值,預設為0,如果是引用預設為空。
我們宣告乙個child類,擁有兩個構造方法:
我們在main類中建立child的兩個物件:
輸出結果:
結論:就算類中屬性散亂定義在不同地方,初始化也會嚴格按照先後順序執行。
我們知道,構造方法的主要作用在於初始化類中的成員變數,那麼它到底何時執行呢?
在這裡,我們在建構函式裡將child2引用指向了另乙個物件:
輸出結果如下:
我們看到,建構函式方法是後被呼叫的。
結論:建構函式的初始化晚於成員變數自初始化。
靜態方法又被稱為類方法,靜態屬性被稱為類域,總是最優先初始化。
靜態方法初始化也有兩種方法:
直接初始化
輸出結果:
採用靜態塊統一初始化
輸出結果:
兩種方法效果一樣。但是,注意如果你靜態塊初始,你一定不能這麼做:
這樣做你是訪問不了靜態屬性的。
你可以這麼理解:靜態塊其實相當於乙個屬於靜態屬性的初始化函式,你就算在裡面定義了變數,作用週期也括號範圍內。所以,你的正確做法是:在外面定義好靜態型別的引用而統一在靜態塊中初始化。
結論:乙個類中初始化順序是:靜態->類屬性->建構函式。
我們增加乙個parent類:
然後讓child繼承paret類,並給child增加乙個靜態塊:
使用main類呼叫child:
結果:
我們可以看到:parent和child的靜態塊先被呼叫,之後按照先父類後子類的順序進行了初始化,而且靜態屬性只初始化一次。
結論:擁有繼承關係時,先是從父類到子類初始化靜態屬性,之後再是從父類到子類初始化非靜態屬性。
單個類中初始化順序:靜態屬性->非靜態屬性->建構函式
繼承時初始化順序:先從父類到子類初始化靜態屬性,再從父類到子類進行非靜態初始工作。
靜態屬性都只初始化一次。
C 類的初始化順序詳解
在主程式建立相關類時,看看類的各個成員的先後呼叫情況,首先說下沒有繼承其他類的情況 class program class testclass1 static testclass1 用於測試成員變數的初始化情況 class testclass2 程式執行結果 可以看出,當例項物件的類沒有父類的情況下...
類初始化順序
類初始化時,jvm會先初始化所有 1,靜態屬性,靜態例項,靜態塊。2.新建例項 靜態或非靜態 時會先執行所有非靜態屬性和構造塊 非靜態屬性和構造塊執行級別相同,誰前誰先 然後構造方法。注意 1 靜態 塊不能存在於任何方法體內。2 靜態 塊不能直接訪問靜態例項變數和例項方法,需要通過類的例項物件來訪問...
類初始化順序
類初始化順序 1.靜態構造塊最先執行,並只執行一次 2.成員變數執行,但靜態成員變數早於靜態塊執行 3.構造塊從上至下依次執行 4.構造方法執行 父類早於子類 父類靜態構造塊 子類靜態構造塊 父類成員變數 父類構造塊 父類構造方法 子類成員變數 子類構造塊 子類構造方法 靜態成員變數先於靜態塊執行 ...