程序运行结果及原因.

类一.[code="java"]class Insect {
private int i = 9;
protected int j;

public Insect() {
    System.out.println("i= " + i + ",j= " + j);
    j = 39;
}

private static int x1 = printInit("static Insect.x1 initialized");

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

}[/code]
类二.[code="java"]public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");

public Beetle() {
    System.out.println("k= " + k);
    System.out.println("j= " + j);
}

private static int x2 = printInit("static Beetle.x2 initialized");

public static void main(String[] args) {
    System.out.println("Beetle constructor");
    Beetle b = new Beetle();
}

}[/code]

初始化顺序为:

1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行

2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行

3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行

4. 父类构造方法

5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行

6. 子类构造方法