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");
    new Cupboard();
    System.out.println(
      "Creating new Cupboard() in main");
    new Cupboard();
    t2.f2(1);
    t3.f3(1);
  }
  static Table t2 = new Table();
  static Cupboard t3 = new Cupboard();

结果:
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)
为什么结果不是:
Creating new Cupboard() in main
Bowl(3)
Bowl(4)
Cupboard()
f(2)
......

解决方案 »

  1.   

    因为Class中static块是先初始化的。
      

  2.   

    明显是TIJ的代码,那里不是讲了吗?
    static块在加载class的时候就执行了(注意:Test.class不会)
    可以去看看java语言规范
      

  3.   

    我来总结一下:
    static块在加载class的时候就执行!!
    注意:加载不只是new,包括类名.也会加载;还有反射的时候class.forName("类")也会加载.并且static修饰的是从上往下依次执行.还有加载第一次的时候会执行,再加载就不会执行了.
      

  4.   

    static块在加载的时候是最新初始化的!
    你可以用debug调试看看!
      

  5.   

    static块在你new的时候就已经初始化了,他是先于main()的,给你个小例子看看:
    public class testexample {
    static demo de=new demo();
    public static void main(String []args)
    {
    System.out.println("nihao");
    }
    }
    class demo{
    demo()
    {
    System.out.println("demo");
    }
    }
    你看看这个结果就知道了,或是在main()那里打个断点,你会看的更加清楚