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

问一个有关静态数据初始化的问题
class   Cup{
Cup(int   marker){
System.out.println( "Cup( "+marker+ ") ");
}
void   f(int   marker){
System.out.println( "f( "+marker+ ") ");
}
}
class   Cups{
static   Cup   c1;
static   Cup   c2;
static{

c1=new   Cup(1);
c2=new   Cup(2);
}
static{
System.out.println( "dfdsfsdf ");
}
Cups(){
System.out.println( "Cups() ");
}
}


  class   ExplicitStatic   {
public   static   void   main(String[]   args)   {
                System.out.println( "Inside   main() ");
                Cups.c1.f(99);//1
             
}
  //static   Cups   x   =   new   Cups();//2
}
这样输出结果是:
Inside   main()
Cup(1)
Cup(2)
dfdsfsdf
Cups()
Press   any   key   to   continue...
但是如果1注释掉,改成2
变成的是:
Cup(1)
Cup(2)
dfdsfsdf
Cups()
Inside   main()
Press   any   key   to   continue...
Inside   main()一个在前,一个在后,请问到底是什么原因啊。。求救啊。。




------解决方案--------------------
class ExplicitStatic {
public static void main(String[] args) {
System.out.println( "Inside main() ");
//Cups.c1.f(99);//1

}
static Cups x = new Cups();//2
}
先初始化静态域,也就是先执行2
------解决方案--------------------
第一种方法执行顺序应该是:
加载类ExplicitStatic --〉执行ExplicitStatic.main()方法 --> 加载类Cups ....

第二种方法执行顺序应该是:
加载类ExplicitStatic(在此期间会加载静态类Cups并实例化) --〉执行ExplicitStatic.main()方法 ....

所以Inside main()一个在前,一个在后

------解决方案--------------------
如果有静态域,会先初始化静态域的