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

在JavaSE的基础笔试题中经常会出现这三个的一个执行顺序,那么他们的执行顺序究竟是怎么样的呢?通过代码我们可以直接看一下最终结果(代码如下)

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来指向父类同时会执行父类的构造方法。
我们都知道静态代码块是最优先执行的,且只会执行一次,当子类的super在调用父类的构造方法时所以先回去执行父类的静态代码块,然后执行子类的静态代码块

讲解

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

反编译

通过反编译工具发现,代码块实际上是被放到了构造方法中,且是放在了构造方法的第一句,那么就不难解释为什么代码块会比构造方法执行顺序考前了,其实在我们执行子类的构造方法时,子类super指向父类的构造方法同时执行父类的构造方法,由于静态代码块执行是优先于main方法的,所以先回去执行父类的静态代码块再执行子类的静态代码块,然后此时super由于指向父类需要去执行父类的构造方法,且代码块会被转换到构造方法的第一行,所以此时就会执行父类的代码块以及构造方法,当super执行完毕回到子类时,由于子类的代码块也被放到了构造方法中,且在super之后所以执行子类代码块再执行子类构造方法

本文转载于原文链接,如需转载请注明原文链接

最后修改:2021 年 01 月 24 日 12 : 30 PM
如果觉得此文章有用,请随意打赏