初始化塊和構造器的執行順序問題

2021-07-30 10:24:43 字數 1616 閱讀 6500

一 初始化塊和構造器的執行順序問題一般性規定

1 初始化塊總在構造器之前執行,初始化塊不能接受形參。

2 用static修飾的初始化塊為靜態初始化塊,由於是靜態的,所以是屬於類,當類載入時,就執行靜態初始化塊,但執行乙個子類時,最先執行其頂層父類的靜態初始化。

3 如果初始化塊是屬於例項的,只要建立一次物件,初始化塊就執行一次。

二 初始化塊和構造器綜合應用

1 **示例

class root

public root() }

class mid extends root

public mid()

public mid(string msg) }

class leaf extends mid

public leaf() }

public class test

}

2 執行結果

root的靜態初始化塊

mid的靜態初始化塊

leaf的靜態初始化塊

root的普通初始化塊

root的無引數的構造器

mid的普通初始化塊

mid的無引數的構造器

mid的帶引數構造器,其引數值:軟體秘笈

leaf的普通初始化塊

執行leaf的構造器

root的普通初始化塊

root的無引數的構造器

mid的普通初始化塊

mid的無引數的構造器

mid的帶引數構造器,其引數值:軟體秘笈

leaf的普通初始化塊

執行leaf的構造器

3 結果分析

3.1 第一次建立第乙個leaf物件時,因為系統中還不存在leaf類,因此需要先載入並初始化leaf類,初始化leaf類時會先執行其頂層父類靜態初始化,再執行其直接父類的靜態初始化塊,最後才執行leaf本身靜態初始化塊。

3.2 一旦leaf類初始化成功後,leaf類在該虛擬機器中將一直存在,因此,當第二次建立leaf例項時無須再對leaf類進行初始化。

3.3普通初始化塊和構造順序與前面介紹的一致,每次建立乙個leaf物件時,都需先執行最頂層父類的初始化,構造器,然後執行其父類初始化,構造器…最後才執行leaf類的初始化塊和構造器。

三 靜態初始化塊與指定初始化值的靜態成員執行順序問題

1 **示例

public class staticinittest

// 再將a靜態成員變數賦值為9

static int a = 9;

public static void main(string args)

}

2 執行結果9

3 結果分析

當jvm第一次主動使用某個類時,系統會在類準備階段為該類所有靜態成員分配記憶體,在初始化階段則負責初始化這些靜態成員變數,初始化靜態成員變數就是執行類初始化**或宣告類成員變數時的初始值,它們的執行順序與源**中的排列順序相同。

初始化塊的執行順序

單個類中初始化塊 靜態初始化塊 構造器的執行順序。無論怎麼寫,先執行第乙個的是靜態初始化塊,第二個是初始化塊,第三個是構造器,如果寫了多個的時候從上往下執行,比如寫了多個初始化塊,在類裡面是從上往下執行的。在繼承中也會執行以上的順序,先執行父類的靜態初始化塊,再執行子類的靜態初始化塊,先執行父類的初...

靜態初始化塊 初始化塊 構造方法

1.所有的靜態初始化塊都優先執行,其次才是非靜態的初始化塊和建構函式,它們的執行順序是 1 父類的靜態初始化塊 2 子類的靜態初始化塊 3 父類的初始化塊 4 父類的建構函式 5 子類的初始化塊 6 子類的建構函式 注意 1 此處的構造方法需要與自己的類名相同,2 靜態 初始化塊需要用 2.構造方法...

建構函式初始化列表執行順序

建構函式初始化列表的順序 證明了 1.先初始化基類再初始化成員,在初始化列表初始類成員是類的,可以減少構造次數 2.類成員是乙個類是棧方式儲存自動釋放,指標類需手動釋放 類a include a.h a a void a a int x a a const a a a a void 類bass in...