Java static 代码块的执行顺序

引言

在Java中,static代码块是用来初始化静态成员变量的一种特殊的代码块。它在类加载时执行,并且只执行一次。但是,当存在多个静态代码块时,程序员可能会对它们的执行顺序产生疑问。本文将详细介绍Java static代码块的执行顺序,并且通过代码示例来说明。

执行顺序

在了解Java static代码块的执行顺序之前,我们先来了解一下静态成员变量的初始化。

静态成员变量可以在声明时直接赋值,也可以在static代码块中进行初始化。当一个类被加载时,会按照以下顺序进行静态成员变量的初始化:

  1. 静态成员变量按照声明的顺序依次进行初始化;
  2. 如果存在静态代码块,那么静态代码块会在静态成员变量初始化之后执行;

通过以下代码示例来说明:

public class StaticDemo {
    public static int num1 = 10;
    public static int num2;
    
    static {
        num2 = 20;
    }
    
    public static void main(String[] args) {
        System.out.println("num1: " + num1);
        System.out.println("num2: " + num2);
    }
}

上述代码中,静态成员变量num1在声明时直接赋值为10,而num2在static代码块中进行初始化为20。在main方法中,我们打印了这两个变量的值。运行结果为:

num1: 10
num2: 20

从结果可以看出,静态成员变量的初始化顺序与声明的顺序一致,而static代码块在静态成员变量初始化之后执行。

接下来,我们将讨论多个静态代码块的执行顺序。

如果一个类中存在多个静态代码块,那么它们的执行顺序与它们在代码中的出现顺序一致。也就是说,先出现的静态代码块先执行,后出现的静态代码块后执行。

通过以下代码示例来说明:

public class StaticDemo {
    public static int num1 = 10;
    public static int num2;
    
    static {
        num2 = 20;
        System.out.println("First static block");
    }
    
    static {
        System.out.println("Second static block");
    }
    
    public static void main(String[] args) {
        System.out.println("num1: " + num1);
        System.out.println("num2: " + num2);
    }
}

上述代码中,我们在静态代码块中分别输出了"First static block"和"Second static block"。在main方法中,我们打印了静态成员变量的值。运行结果为:

First static block
Second static block
num1: 10
num2: 20

从结果可以看出,先出现的静态代码块先执行,后出现的静态代码块后执行。

总结

在Java中,static代码块是用来初始化静态成员变量的一种特殊的代码块。它在类加载时执行,并且只执行一次。当存在多个静态代码块时,它们的执行顺序与它们在代码中的出现顺序一致。静态成员变量的初始化顺序与声明的顺序一致。

希望通过本文的介绍,读者对Java static代码块的执行顺序有了更深入的理解。

参考资料

  • [Java static block](
  • [Java static block execution](