Java中静态代码块、代码块以及构造函数执行顺序详解

2020-09-30 01:57:26 浏览数 (2)

静态代码块,代码块,构造方法执行顺序

前段时间面试,做到一个笔试题主要考察的是静态代码块,代码块,构造方法的执行顺序,由于自己没复习所以这个题肯定没做出来,回家后在Idea中进行代码测试运行。

测试代码如下

代码语言:javascript复制
public class testOne extends TestTwo{    public testOne(){        System.out.println("子类构造方法");    }    {        System.out.println("子类代码块");    }    static {        System.out.println("子类静态代码块");    }    public static void main(String[] args) {        new testOne();    }}

class  TestTwo{    public TestTwo(){        System.out.println("父类构造方法");    }    {        System.out.println("父类代码块");    }    static {        System.out.println("父类静态代码块");    }    public static void find(){        System.out.println("静态方法");    }}

执行结果如下

可以看出到实际上执行顺序应该是父类静态代码块——>子类静态代码块——>父类代码块——>父类构造方法——>子类代码块——>子类构造方法。

为什么先执行父类的静态代码块呢?

但是为什么会这样呢?其实当我们在创建子类时,实际上子类的构造方法的第一行存在一个隐式的super,super是一个指向父类的指针,所以在执行构造方法时会通过super来指向父类,同时会执行父类的构造方法。

静态代码块在Java是最优先执行的,且只会执行一次,当子类的super在调用父类的构造方法时所以先回去执行父类的静态代码块,然后执行子类的静态代码块,所以会执行父类静态代码块再执行子类静态代码块。

为什么第二个执行代码块?

讲完了静态代码块是最优先执行的,但是为什么代码块的执行顺序会比构造方法先呢?我们通过反编译工具来看一下

通过反编译工具发现,代码块实际上是被放到了构造方法中,且是放在了构造方法的第一行,那么就不难解释为什么代码块会比构造方法执行顺序靠前。

其实在我们执行子类的构造方法时,子类super指向父类的构造方法同时执行父类的构造方法,所以先会去执行父类的静态代码块再执行子类的静态代码块,然后此时super由于指向父类需要去执行父类的构造方法,且代码块会被转换到构造方法的第一行,所以此时就会执行父类的代码块以及构造方法,当super执行完毕回到子类时,由于子类的代码块也被放到了构造方法中,且在super之后所以执行子类代码块再执行子类构造方法。

0 人点赞