📜  在Java中使用静态修饰符的类加载和静态块执行(1)

📅  最后修改于: 2023-12-03 15:07:53.667000             🧑  作者: Mango

在Java中使用静态修饰符的类加载和静态块执行

在Java中,静态修饰符可以用于类、变量和方法上,用来表示它们是静态的,即属于类本身而不是某个对象。在使用静态修饰符的过程中,类的静态成员会在类加载时自动初始化,并且静态块会在静态成员初始化后执行。

类加载过程

在Java中,类的加载过程可以分为以下三个阶段:

  1. 加载(loading):通过类的全限定名,将类的字节码文件加载到JVM中,生成对应的Class对象。
  2. 链接(linking):将已加载的Class对象和其他相关的类进行关联、验证和准备(静态变量的默认值设置),并最终生成可执行代码。
  3. 初始化(initializing):为类的静态变量赋初值,以及执行类的静态块。

在类加载过程中,静态修饰符的作用主要体现在第三个阶段。

静态成员初始化

在Java中,静态变量是属于类本身的,因此会在类加载时(链接阶段的准备阶段)自动初始化。静态变量的默认值可以是0、false或者null,也可以是程序员显式指定的值。

public class MyClass {
    // 静态变量,在类加载时自动初始化
    public static int number = 1;
}

与静态变量不同,静态块中的语句仅在类第一次加载时执行。静态块为程序员提供了一种在类加载时执行一些额外操作的方式,比如读取配置文件或者向数据库建立连接等。

public class MyClass {
    // 静态块,在类第一次加载时执行
    static {
        System.out.println("MyClass is loaded.");
    }
}
静态块的执行顺序

在一个类中,可以定义多个静态块,在类加载时它们会按照定义顺序依次执行。对于一个类中的静态变量和静态块,它们的执行顺序是先静态变量再静态块,并且按照定义顺序执行。

public class MyClass {
    // 第一个静态块
    static {
        System.out.println("First static block.");
    }
    // 静态变量
    public static int number = 1;
    // 第二个静态块
    static {
        System.out.println("Second static block. number=" + number);
    }
}

以上代码的输出结果如下:

First static block.
Second static block. number=1
总结

在Java中,静态修饰符可以用于类、变量和方法上,表示它们是静态的。在使用静态修饰符的过程中,类的静态成员会在类加载时自动初始化,并且静态块会在静态成员初始化后执行。静态块可以为程序员提供一种在类加载时执行一些额外操作的方式。在一个类中,静态块会按照定义顺序依次执行,而静态变量会在静态块执行前被初始化。