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 Hello{
public static void main(String[] ars){
A ab = new B();
ab = new B();
}
}这个为什么显示1a2b2b呀  谁能帮我解释下么 谢谢

解决方案 »

  1.   

    new B()会先初始化B这个对象,当初始化B的时候发现A还没有初始化,所以会先初始化A,也就执行了A中的static块,接着就是B中的static块,然后就是创建对象B,调用B的构造函数,构造函数是从上往下调用的,所以会先执行A的构造方法,再执行B的构造方法,所以就出现了1a2b2b的字符串
      

  2.   

    对象的创建过程是这样的。当你new B()的时候因为B继承自A所以要自上而下进行初始化,首先是变量的和static块的初始化。然后才是构造器的初始化。所以你会看到1a2b
      

  3.   

    static只在初始的时候走一遍,在执行就不走了.
      

  4.   

    第一个new:类加载的时候首先会调用静态代码块里的内容(只调用一次),然后调用父类的构造函数,再调用子类的构造函数,所以会输出1a2b
    第二类new:先调用父类的构造函数,再调用子类的构造函数,所以会输出2b
    不知道说得清不清楚···