返回

Android面试之——静态代码块执行顺序剖析

Android

前言

在Android面试中,关于静态代码块的执行顺序问题可谓是面试官的必考题之一。为了帮助大家更好地理解静态代码块的执行顺序,我们先来看一段代码:

// 父类
class Parent {
    // 静态代码块
    static {
        System.out.println("父类静态代码块执行");
    }

    // 构造方法
    public Parent() {
        System.out.println("父类构造方法执行");
    }
}

// 子类
class Child extends Parent {
    // 静态代码块
    static {
        System.out.println("子类静态代码块执行");
    }

    // 构造方法
    public Child() {
        System.out.println("子类构造方法执行");
    }
}

// 调用代码
public class Main {
    public static void main(String[] args) {
        System.out.println("调用代码执行");
        Child child = new Child();
    }
}

这段代码的运行结果如下:

父类静态代码块执行
子类静态代码块执行
调用代码执行
父类构造方法执行
子类构造方法执行

从运行结果中,我们可以看到,父类静态代码块首先执行,然后是子类静态代码块,最后才是调用代码和构造方法。

执行顺序剖析

为了更深入地理解静态代码块的执行顺序,我们来逐步分析一下这段代码:

  1. 当Java虚拟机加载一个类时,它会首先执行该类的静态代码块。静态代码块中的代码只会被执行一次,并且在类被加载时执行。

  2. 在调用代码中,我们创建了一个Child类的实例。当Java虚拟机创建Child类的实例时,它会首先执行Child类的静态代码块,然后执行Child类的构造方法。

  3. Child类的构造方法中,我们调用了父类的构造方法。当Java虚拟机执行父类的构造方法时,它会首先执行父类的静态代码块,然后执行父类的构造方法。

因此,这段代码的运行结果如下:

  1. 父类静态代码块执行。
  2. 子类静态代码块执行。
  3. 调用代码执行。
  4. 父类构造方法执行。
  5. 子类构造方法执行。

总结

通过分析这段代码,我们可以得出以下结论:

  1. 父类的静态代码块在子类的静态代码块之前执行。
  2. 在创建子类的实例时,Java虚拟机会先执行子类的静态代码块,然后执行子类的构造方法。
  3. 在子类的构造方法中调用父类的构造方法时,Java虚拟机会先执行父类的静态代码块,然后执行父类的构造方法。

希望这篇文章能帮助大家更好地理解Java中静态代码块的执行顺序。