Ok Let's see it step by step:0. public static void main(String[] args)
1. JVM 准备加载 class Beetle 由于他继承了 Insect 所以 class Insect 将先被加载
2. 分配所有 变量的空间 i j x1 x2 k 但是 并没有赋值(实际上赋了缺省值 i=0,j=0 ...)
3. 初始化 static 变量
4. 下面依次执行 main 里面的语句 prt("Beetle constructor");
5. Beetle b = new Beetle(); 调用到了 构造函数 Beetle() 这里要注意的是
   在 Beetle() 里会先调用一个 super() 会逐级向上 直到 Object
6. 于是执行 构造函数 Insect() 但在执行其内部语句之前 会先初始化 实例变量(i=9 j=0)
7. prt("i = " + i + ", j = " + j);
8. j = 39;
9. 回到构造函数 Beetle() 初始化 实例变量 k=prt("Beetle.k initialized");//(k = 47)
10.最后 prt("k = " + k);prt("j = " + j);> 还有 K是怎么被赋的47
因为在 int prt(String s) 里 有一个 return 47; 当函数完成后 就把这个 47 返回给了 k

解决方案 »

  1.   

    在说一说 
    static Insect.x1 initialized static Beetle.x2 initialized为什么先输出
      

  2.   

    不是说了吗 在第三步
    3. 初始化 static 变量 的时候
    static int x1 = prt("static Insect.x1 initialized");
    static int x2 = prt("static Beetle.x2 initialized");
    用到了 你自己定义的 prt 函数 (在 class Insect 中定义的)这时 static Insect.x1 initialized ,static Beetle.x2 initialized 就被输出了
    而其他的输出要到后面的步骤中才行