前言
在Java的一個類中會有很多的東西,初始化塊,靜態初始化塊,方法…
那麼在new
一個類的對象的時候這些東西的初始化順序一定有先後。先執行呢裏的在執行哪裏的都有說法。接下來我們用一個個小實驗來證明初始化塊 靜態初始化塊 類變量 類方法 構造器
的執行順序
實驗
public class MainStart {
public static void main(String[] args) {
B1 a1 = new B1();
}
}
class A1 {
static {
System.out.println("父類靜態初始化塊");
}
{
System.out.println("父類非靜態初始化塊");
}
A1() {
System.out.println("父類構造器");
}
}
class B1 extends A1 {
static {
System.out.println("子類靜態初始化塊");
}
{
System.out.println("子類費靜態初始化塊");
}
B1() {
System.out.println("子類構造器");
}
}
結果如下我們可以看到先執行在我們創建一個子類對象的時候先執行父類靜態初始化塊, 然後執行子類靜態初始化塊, 然後執行父類初始化塊, 父類構造器, 子類初始化塊, 子類構造器;
小知識
那我們剛纔研究了創建一個子類對象是這樣調用的,那我們來試一下多態情況下是怎麼調用的;
public class MainStart {
public static void main(String[] args) {
B1 b1 = new B1();
A1 a1 = new B1();
}
我們這裏只改變main方法裏的內容,增加一句利用多態的性質創建對象;
這裏的結果如下
這裏咋肥四鴨?????
我們可以看到第二句利用多態創建的子類對象不執行靜態初始化塊了!!!
其實這是因爲在同一個程序中,也就是同一個jvm進程中,第一次使用類的時候就已經完成了類的初始化,而靜態的內容屬於類本身,所以在第二次調用的時候就不會在執行靜態初始化塊裏的內容了,同樣的對於靜態變量只會初始化一次在一個程序中只會初始化一次;
最後一個問題
靜態變量和靜態初始化塊誰先執行!!
這個我們這裏就不做實驗了,誰在前面誰先執行!!哪怕你在靜態初始化塊中調用了靜態變量,也是誰在前面誰先執行。如果此時靜態變量在後面那麼就會報錯了!