对于很多同学而言,Java里面的执行顺序一直都是一个比较重要的话题。很多程序员在面试时的时候,也会被问到这类问题。那么,我们下面就通过一个例子,来看一下,Java中的代码执行顺序是怎样的。
我们先来看一个问题,下面的代码,执行出来的结果是什么样的呢?
class Bird {
{
System.out.print("b1 ");
}
static {
System.out.print("r4 ");
}
public Bird() {
System.out.print("b2 ");
}
}
class Raptor extends Bird {
static {
System.out.print("r1 ");
}
public Raptor() {
System.out.print("r2 ");
}
{
System.out.print("r3 ");
}
}
class Hawk extends Raptor {
public static void main(String[] args) {
System.out.print("pre ");
new Hawk();
System.out.println("hawk ");
}
}
答案是:r4 r1 pre b1 b2 r3 r2 hawk
为什么是这样呢?原因就在于Java的执行顺序。
对于Java而言,其执行顺序为:
jvm加载时:父类静态代码块 > 子类静态代码块
生成对象时:父类构造块 > 父类构造方法 > 子类构造块 > 子类构造方法
所以我们可以看到,jvm加载时,代码首先执行的是父类中的static代码块,打印出r4。
然后执行了子类中的static代码块,打印出r1。
然后执行main函数中的打印pre。
然后执行父类构造块,打印出b1。
然后执行父类构造方法,打印出b2。
然后执行子类构造块,打印出r3。
然后执行子类构造方法,打印出r2。
最后执行main函数中构造对象之后的打印hawk。