class A{ 
    static{ 
        System.out.print("1"); 
   } 
   public A(){ 
       System.out.print("2"); 
   } 

class B extends A{ 
    static{ 
        System.out.print("a"); 
    } 
   public B(){ 
      System.out.print("b"); 
   } 

   public class Code4{ 
      public static void main(String[] ars){ 
     A ab = new B();
     ab = new B();
   } 
}

解决方案 »

  1.   

    无论你的代码写的是什么,首先是类加载,会在加载的过程中加载静态成员(没有就不加了)
    然后是执行静态代码块(在加载时进行,与子类构造器调用无关)(先加载父类的其次是子类
    的),完成以后程序才会进入main()方法中,执行new语句,两个都是先调用父类构造器再
    调用子类构造器。所以你调用几次都是一样的顺序,而且不要认为第一次调用时会先执行静态
    初始化块,不是这样的,静态的会在类加载时加载并初始化,那个时候程序只是在加载算是准
    备阶段,只有之后进入main方法中才算是代码的开始运作。