1. 普通初始化塊
a. 前面定義的先執行,後面定義的後執行。
b. 初始化塊是在創建Java對象時隱式執行的,他們總是全部執行,所以完全可以把多個初始化塊合併到一起。
c. 普通初始化塊、聲明實例變量時指定的默認值都可以認爲是對象的初始化代碼
public class Demo{
{
a=6;
}
int a=9;
}
最後輸出a爲9,調換則爲6.d. 初始化塊其實是一個假象,使用Javac命令編譯Java類之後,該java類中的初始化塊會消失,初始化塊會還原到每個構造器當中,並且位於構造器的最前面。
那麼爲什麼不直接放在構造器裏面呢?這樣做的話,如果有多個構造器,那麼每個構造器都要重複寫一遍這個代碼,把重複代碼抽出來放在初始化塊當中可以避免重複寫相同的代碼,並且效果是一樣的。
2. 靜態初始化塊(類初始化塊)
a. 系統在類初始化階段執行靜態初始化塊,而不是在創建對象時才執行。
b. 聲明靜態成員變量時指定默認的初始值,也可以當成是靜態初始化塊。
c. 當JVM第一次主動使用某個類時,系統會在類準備階段爲該類的所有靜態成員變量分配內存;在初始化階段負責初始化這些靜態成員變量。
3. 執行順序:
父類靜態初始化塊
子類靜態初始化塊
父類初始化塊
父類構造函數
子類初始化塊
子類構造函數
- 其中靜態的只在類初始化階段執行一次,後面不會再執行,而初始化塊和構造器每次創建實例的時候都是會執行的