一 初始化塊和構造器的執行順序問題一般性規定
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...