日期:2014-05-20  浏览次数:20626 次

一个类初始化顺序的小问题
public   class   Test3   {
  public   static   void   main(String[]   args)   {
    Test3   t   =   new   Test3(l);
  }//main
 
  static   int   i   =   5;
  static   int   l;
  int   j   =   7;
  int   k   ;
 
  public   Test3(int   m)   {
    print(l);
    print(m);
    print(i+ "     "+j+ "     "+k+ "     "+m);
  }
  {
    j   =   70;   l   =   20;
  }
  static   {
    i   =   50;
  }

  public   static   void   print(Object   o)   {
    System.out.println(o);    
  }//print

}//   Test3

===================
为什么上面的print(m)答应的是【0】而不是【20】?
类初始化的顺序中,字段初始化和非静态变量初始化应该在构造函数前面执行的啊?!
不解!
麻烦哪位帮我解释一下!谢谢!

------解决方案--------------------
"but,在执行构造函数之前,不是先要执行字段的声明和非静态块的吗?! "

是在执行 "构造函数体里面的内容 "之前才先要执行 "字段的声明 "和 "非静态块 "
实际上,编译器会把
"字段的声明 ", "非静态块 "按顺序扔到一个方法中,然后再把构造函数体里面的内容扔到这个方法中
这个方法才是真正的初始化方法

"字段的声明 ", "非静态块 "都是其一部分

------解决方案--------------------
在类加载的时候,l是0吧,你new Test3(l);的时候,在去构造这个类实例之前就把l的值取出来了,是0,
然后才是去执行字段的声明和非静态块,执行构造函数等等。。