Java類(繼承)初始化順序

FrankYou發表於2016-11-02
/**
 * Created by xfyou on 2016/11/2.
 * Java繼承的初始化
 */
public class Beetle extends Insect {
    int k = prt("Beetle.k initialized");

    public Beetle() {
        prt("k = " + k);
        prt("j = " + j);
    }

    static int x2 = prt("static Beetle.x2 initialized");

    static int prt(String s) {
        System.out.println(s);
        return 63;
    }

    public static void main(String[] args) {
        prt("Beetle constructor");
        Beetle b = new Beetle();
    }
}

class Insect {
    int i = 9;
    int j;

    public Insect() {
        prt("i = " + i + ", j = " + j);
        j = 39;
    }

    static int x1 = prt("static Insect.x1 initialized");

    static int prt(String s) {
        System.out.println(s);
        return 47;
    }
}

執行結果如下:

static Insect.x1 initialized

static Beetle.x2 initialized

Beetle constructor

i = 9, j = 0

Beetle.k initialized

k = 63

j = 39

執行順序總結:

1、父類靜態欄位

2、父類靜態初始化塊

3、子類靜態欄位

4、子類靜態初始化塊

5、父類例項欄位

6、父類例項初始化塊

7、父類構造器

8、子類例項欄位

9、子類例項初始化塊

10、子類構造器

 

沒有繼承的單個類的初始化順序為:

  • 靜態欄位
  • 靜態初始化塊
  • 例項欄位
  • 例項初始化塊
  • 構造器

 

相關文章