面试小结(关于静态代码块执行顺序)
先上代码:
这里有个A类
public class A{
static{
System.out.println(1);
}
public A(){
System.out.println(2);
}
这里有个B类继承了A类
public class B extends A{
static{
System.out.println("a");
}
public B(){
System.out.println("b");
}
}
有一个main方法执行以下代码
public static void main(String[] args) {
//A静态块->B静态块->A构造方法->B构造方法
A ab = new B();
//A构造方法->B构造方法
ab = new B();
}
执行结果为1a2b2b
总结:
在静态代码块中,静态块执行>构造器>普通类方法。
这道题,单就考察了一个知识点,就是当类被调用的时候静态块只初始化一次。还涉及到了一个父类型的引用指向子类型对象,我们将其称之为“向上造型”。本题在执行A ab = new B()
时,先执行了父类A的静态块,然后执行了子类B的静态块,执行了A类的构造方法,执行了B类的构造方法。之后执行ab = new B()
再次创建一个B对象时,我们发现A,B类的静态块不执行了,只执行了构造方法!