類加載順序

若不用new 則只加載靜態修飾的內容

靜態變量>靜態塊>mian

public class Father {

    int i;

    static int staticI;

    static {System.out.println("Father 靜態代碼塊1"+" (++staticI)="+(++staticI));}

    {System.out.println("Father 非靜態代碼塊1"+" i="+i+" (++staticI)="+(++staticI));}

    public Father() {System.out.println("Father 構造器");}

    {System.out.println("Father 非靜態代碼塊2"+" i="+i+" (++staticI)="+(++staticI));}

    static {System.out.println("Father 靜態代碼塊2"+" (++staticI)="+(++staticI));}

    public static void main(String[] args) {System.out.println("main 方法"+" (++staticI)="+(++staticI));}

    {System.out.println("Father 非靜態代碼塊3"+" i="+i+" (++staticI)="+(++staticI));}

    static {System.out.println("Father 靜態代碼塊3"+" (++staticI)="+(++staticI));}

}

運行結果

Father 靜態代碼塊1 (++staticI)=1
Father 靜態代碼塊2 (++staticI)=2
Father 靜態代碼塊3 (++staticI)=3
main 方法 (++staticI)=4

靜態內容>非靜態變量>非靜態塊>構造器

將main也歸納到靜態內容

將上面代碼的main改造:

public static void main(String[] args) {
    System.out.println("main 方法"+" (++staticI)="+(++staticI));
    new Father();
}

運行結果

Father 靜態代碼塊1 (++staticI)=1
Father 靜態代碼塊2 (++staticI)=2
Father 靜態代碼塊3 (++staticI)=3
main 方法 (++staticI)=4
Father 非靜態代碼塊1 i=0 (++staticI)=5
Father 非靜態代碼塊2 i=0 (++staticI)=6
Father 非靜態代碼塊3 i=0 (++staticI)=7
Father 構造器

結論

  1. 加載的順序從上至下
  2. 靜態變量>靜態塊>main>非靜態變量>非靜態塊>構造器

有子類又會咋麼樣呢?

既然上面已經證明了在遵循加載規則的情況下順序爲從上至下

那麼就可以簡化代碼了

public class CopyOfFather {

    int i;

    static int staticI;

    static {System.out.println("Father 靜態代碼塊1"+" (++staticI)="+(++staticI));}

    {System.out.println("Father 非靜態代碼塊1"+" i="+i+" (++staticI)="+(++staticI));}

    public CopyOfFather() {System.out.println("Father 構造器");}

    public static void main(String[] args) {
        System.out.println("main 方法");
        System.out.println("(++CopyOfSon.staticI)="+(++CopyOfSon.staticI));
    }
}

class CopyOfSon extends CopyOfFather {
    int i;

    static int staticI;

    public CopyOfSon() {System.out.println("Son 構造器");}

    static {System.out.println("Son 靜態代碼塊1"+" (++staticI)="+(++staticI));}

    {System.out.println("Son 非靜態代碼塊1"+" i="+i+" (++staticI)="+(++staticI));}

}

執行結果

Father 靜態代碼塊1 (++staticI)=1
main 方法
Son 靜態代碼塊1 (++staticI)=1
(++CopyOfSon.staticI)=2

結論:父類靜態內容>子類靜態內容

new 子類會怎麼樣

改造main:

public static void main(String[] args) {
    System.out.println("main 方法");
    new CopyOfSon();
}

運行結果

Father 靜態代碼塊1 (++staticI)=1
main 方法
Son 靜態代碼塊1 (++staticI)=1
Father 非靜態代碼塊1 i=0 (++staticI)=2
Father 構造器
Son 非靜態代碼塊1 i=0 (++staticI)=2
Son 構造器

結論

此處非靜態內容不包括構造器

父類靜態內容>子類靜態內容>父類非靜態內容>父類構造器>子類非靜態內容>子類構造器

詳細結論

父類靜態變量>父類靜態代碼塊>父類main>子類靜態變量>子類靜態代碼塊>父類非靜態變量>父類非靜態代碼塊>父類構造器>子類非靜態變量>子類非靜態代碼塊>子類構造器

請記住:

1.靜態>非靜態
2.變量>代碼塊: 先定義變量後在代碼塊使用
3.構造器在最後

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章