// 檔名:Beetle.java
// The full process of initialization.
class Insect {
    int i = 9;
    int j;
    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;
    }
}
public class Beetle extends Insect {
    int k = prt("Beetle.k initialized");
    Beetle() {
        prt("k = " + k);
        prt("j = " + j);
    }    static int x2 = prt("static Beetle.x2 initialized");
    public static void main(String[] args) {
        prt("Beetle constructor");
        Beetle b = new Beetle();
    }

大家幫我看看,為什麼會出現那個結果?
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39

解决方案 »

  1.   

    从结果证明:
    1。子类初始化之前首先要保证父类已经被正确初始化,所以在打印
    Beetle.k initialized之前打印i = 9, j = 0,所以在后来j=39(父类构造函数赋值了)2。其次,静态域的初始化将在类的第一次初始化时发生,并仅仅发生一次
      

  2.   

    static Insect.x1 initialized
    static Beetle.x2 initialized   //首先执行的static域的初始化执行;这是在类装载的时候执行;类的装载也是先父类后子类,所以是上面这个顺序;
    Beetle constructor //然后再执行main方法类的东西;
    i = 9, j = 0  //类对象的构造:先构造父类然后再构造子类;先初始化成员变量;如果没有明确初始化则赋值为默认值;如:int为0;所以j=0;然后再执行构造函数的初始化
    Beetle.k initialized //子类对象的构造顺序同父类一样,先成员变量;然后构造函数
    k = 47
    j = 39 //此时j已经在父类中赋值为39了,所以是39不是0
      

  3.   

    这个TIJ 3rd里面的例子吧,好像它后面说得挺详细了的
      

  4.   

    k=47是通过int k = prt("Beetle.k initialized");获得的;
    成员变量的初始化是在构造函数执行之前,所以子类的构造函数执行的时候k已经为47了
      

  5.   

    to everyone:
    我現在有些不明白的是:  在初始化靜態成員的時候也是從父類->子類嗎?
      

  6.   

    对的,static块初始化也是从父类到子类的。