最近狂看Thinking in java ,看到这里卡壳了,请各位不吝赐教!
内容如下:
2. 静态数据的初始化
若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面这个例子可将这个问题说更清楚一些:
//: StaticInitialization.java
// Specifying initial values in a
// class definition.class Bowl {
  Bowl(int er) {
    System.out.println("Bowl(" + er + ")");
  }
  void f(int er) {
    System.out.println("f(" + er + ")");
  }
}class Table {
  static Bowl b1 = new Bowl(1);
  Table() {
    System.out.println("Table()");
    b2.f(1);
  }
  void f2(int er) {
    System.out.println("f2(" + er + ")");
  }
  static Bowl b2 = new Bowl(2);
}class Cupboard {
  Bowl b3 = new Bowl(3);
  static Bowl b4 = new Bowl(4);
  Cupboard() {
    System.out.println("Cupboard()");
    b4.f(2);
  }
  void f3(int er) {
    System.out.println("f3(" + er + ")");
  }
  static Bowl b5 = new Bowl(5);
}public class StaticInitialization {
  public static void main(String[] args) {   
    System.out.println(
      "Creating new Cupboard() in main");  //从main开始执行的话,应该先输出
    new Cupboard();                        //Creating new Cupboard() in main这句,是吧,
    System.out.println(                    //但是,实际输出怎么先输出Bowl(1),不明白!
      "Creating new Cupboard() in main");
    new Cupboard();
    t2.f2(1);
    t3.f3(1);
  }
  static Table t2 = new Table();
  static Cupboard t3 = new Cupboard();
} ///:~Bowl允许我们检查一个类的创建过程,而Table和Cupboard能创建散布于类定义中的Bowl的static成员。注意在static定义之前,Cupboard先创建了一个非static的Bowl b3。它的输出结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
不明白,请大虾指点,小生再次谢过!

解决方案 »

  1.   

    static Table t2 = new Table();
     static Cupboard t3 = new Cupboard();
    ----------------------------------------
    先执行的是main函数中的static变量
      

  2.   

    所以,先运行new Table();
    ----------------------------
    然后,可以看到:
    static Bowl b1 = new Bowl(1);
        
    static Bowl b2 = new Bowl(2);Table() {
        System.out.println("Table()");
        b2.f(1);
    }void f2(int er) {
        System.out.println("f2(" + er + ")");
    }
    ------------------------------------------------------
    还是先执行static变量的初始化动作,所以有了new Bowl(1);
      

  3.   

    呵呵,又见thinking in java中的例子了,好眼熟!楼主多注意初始化顺序,static最先初始化
      

  4.   

    最先初始化static,然后才是非static的变量/对象,这样说是明白的很了,
    初始化时先是static的!!!谢谢!
    结帖了!