Java中类的初始化顺序:静态方法,静态块,非静态块 加油!@!!

理论知识

在Java中,类的初始化顺序是一个重要且有时容易混淆的概念。下面是关于Java类初始化顺序的基本规则,特别是涉及到静态方法、静态块和非静态块时:

  1. 静态变量和静态初始化块

    • 当类被加载到JVM时(即第一次主动使用该类时,如创建类的实例、访问类的静态变量或静态方法等),类的静态变量和静态初始化块会被初始化。
    • 静态初始化块(也称为静态代码块)在静态变量初始化之后、创建类的任何实例之前执行。
    • 如果有多个静态初始化块,它们会按照在源代码中出现的顺序执行。
    • 静态变量和静态初始化块只会在类被加载时执行一次。
  2. 实例变量和非静态初始化块

    • 当创建类的实例时,实例变量和非静态初始化块(也称为实例初始化块或初始化块)会被初始化。
    • 如果一个类有多个非静态初始化块,它们会按照在源代码中出现的顺序执行。
    • 非静态初始化块在实例变量初始化之后、类的构造函数之前执行。
    • 每次创建类的实例时,都会执行非静态初始化块。
  3. 构造函数

    • 在非静态初始化块执行完毕后,会调用类的构造函数。
    • 构造函数用于初始化实例的状态,并在每次创建类的实例时执行。
    • 如果有多个构造函数,可以根据传入的参数来选择使用哪一个。
    • 如果在类的定义中没有显式地提供构造函数,编译器会提供一个默认的构造函数。
  4. 静态方法

    • 静态方法属于类本身,而不是类的实例。
    • 静态方法可以通过类名直接调用,无需创建类的实例。
    • 静态方法不能访问类的非静态成员(包括非静态变量和非静态方法),除非通过类的实例来访问。
    • 静态方法的执行不依赖于类的初始化过程。它们可以在类被加载之前、之后或类的实例被创建之前、之后调用。

总结:Java中类的初始化顺序大致为:静态变量和静态初始化块(只执行一次) -> 实例变量和非静态初始化块(每次创建实例时执行) -> 构造函数(每次创建实例时执行)。而静态方法的执行则不依赖于类的初始化过程。

下滑查看解决方法

代码示例

public class InitializationOrderExample {

    // 静态变量
    private static int staticVar = initializeStaticVar();

    // 静态初始化块
    static {
        System.out.println("静态初始化块执行");
        // 这里可以执行一些静态变量的初始化或其他静态相关的代码
    }

    // 实例变量
    private int instanceVar;

    // 非静态初始化块(也称为实例初始化块)
    {
        System.out.println("非静态初始化块执行");
        // 这里可以执行一些实例变量的初始化或其他实例相关的代码
        instanceVar = 42;
    }

    // 构造函数
    public InitializationOrderExample() {
        System.out.println("构造函数执行");
        // 这里可以执行一些构造函数特有的初始化代码
    }

    // 静态方法
    public static int initializeStaticVar() {
        System.out.println("静态方法initializeStaticVar执行");
        return 1; // 假设静态变量被初始化为1
    }

    // 主方法,用于测试
    public static void main(String[] args) {
        // 第一次主动使用类,触发类的加载和静态初始化
        System.out.println("静态变量staticVar的值:" + staticVar);

        // 创建类的实例,触发实例初始化和构造函数
        InitializationOrderExample example1 = new InitializationOrderExample();
        InitializationOrderExample example2 = new InitializationOrderExample();
    }
}

当运行这个程序时,输出将会是:

静态方法initializeStaticVar执行
静态初始化块执行
静态变量staticVar的值:1
非静态初始化块执行
构造函数执行
非静态初始化块执行
构造函数执行

从这个输出中,我们可以看到:

  1. 静态方法initializeStaticVar首先被执行,用于初始化静态变量staticVar
  2. 接着执行静态初始化块。
  3. 然后是main方法中打印静态变量staticVar的值。
  4. 当创建InitializationOrderExample类的实例时(即example1example2),会先执行非静态初始化块,然后执行构造函数。

注意,静态初始化块和静态方法只会在类第一次被主动使用时执行一次,而非静态初始化块和构造函数则会在每次创建类的实例时执行。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值