了解几个关键的地方就行了:
从全局变量的初始化开始
static Table t2 = new Table();
//Table()中也是内部变量的初始化先开始,然后是构造方法
static Cupboard t3 = new Cupboard();
然后才是main方法内的。

解决方案 »

  1.   

    class Bowl {
      Bowl(int er) {      ---------------------3,5构造
        System.out.println("Bowl(" + er + ")");
      }
      void f(int er) {   ----------------------7,被table调用
        System.out.println("f(" + er + ")");
      }
    }class Table {
      static Bowl b1 = new Bowl(1);     -----------------2,构造之前,也先static变量
      Table() {                         -----------------6,变量已全部构造完成,执行构造函数
        System.out.println("Table()");
        b2.f(1);                        -----------------调用bow的f()
      }
      void f2(int er) {
        System.out.println("f2(" + er + ")");
      }
      static Bowl b2 = new Bowl(2);    ------------------4,第二个static变量的构造
    }class Cupboard {
      Bowl b3 = new Bowl(3);             -------------------11,static构造完后,构造非static成员
      static Bowl b4 = new Bowl(4);         -----------------9,先static成员构造
      Cupboard() {                         ----------------12,成员已经构造好,执行构造函数
        System.out.println("Cupboard()");
        b4.f(2);                       --------------13,调用bow的f()
      }
      void f3(int er) {
        System.out.println("f3(" + er + ")");
      }
      static Bowl b5 = new Bowl(5);         ----------------10,按次序构造static成员
    }public class StaticInitialization {
      public static void main(String[] args) {
        System.out.println(
          "Creating new Cupboard() in main");           -----------14,成员已经构造好,执行main函数体,首先执行此句
        new Cupboard();                      ------------------15,构造临时Cupboard对象
        System.out.println(
          "Creating new Cupboard() in main");
        new Cupboard();
        t2.f2(1);
        t3.f3(1);
      }
      static Table t2 = new Table();    -------------------1,先static变量
      static Cupboard t3 = new Cupboard();-----------------8,继续构造static成员
    }只写到15,后面应该自己会写了,都是重复劳动。前面已经能够说明问题了。记住:
    构造类前先构造父类(如果父类还有父类,则先构造这个父类的父类,类推)
    构造类的时候,先构造static变量(按代码顺序),构造完成后,构造非static变量
    变量全部构造好以后,进入构造函数。
      

  2.   

    1).先执行staic Table t2=new Table()这一句,
    Table初始化呢又先执行Staic Bowl b1=new Bowl(1);
    然后bowl初始化执行System.out.println("Bowl("+er+")")这一句了,这时er为1。了所以先打印bowl(1)。
    2).Table里面的第二句为static Bowl b2=new Bowl(2)。因此打印Bowl(2)。
    3).table里面的属性初始完后是table初始化打印table()。
    4).调用b2.f1().打印出f(1)了。
    5).Cupboad里面的b3初始化完后,转向下一个属性变量static Bowl b4= new Bowl(4).就是打  印Bowl(4)了。
    6)因此类推.......
    老兄我也就不一一叙述了。总之要记住在类中先初始化属性变量,然后才是构造函数。这个问题也很有意思。