You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中静态初始化块何时执行?两段代码输出差异解析

Java静态初始化块的执行时机解析

先明确核心规则:Java类的静态初始化块,只会在类被主动初始化的时候执行。而类的主动初始化有明确触发场景,我们结合给出的两段代码来分析差异:

测试代码

public class Parent {
    public static int y=10 ;
}

public class Child extends Parent {
    static {
        y=20 ;
    }

    public static void main(String[] args) {
        System.out.println(Child.y);  // output = 20
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(Child.y); // output = 10
    }
}

代码差异分析

  1. 第一段代码(Child作为启动类)
    当JVM启动运行Child类时,Child是带main方法的启动类,会触发Child类的主动初始化,此时Child的静态初始化块会被执行,把继承自Parent的静态变量y修改为20,所以最终输出20。

  2. 第二段代码(Test作为启动类)
    这里访问Child.y时,JVM会识别到y是Parent类定义的静态变量,属于父类成员。此时只是直接访问父类的静态变量,并没有触发Child类的主动初始化(没有符合Child初始化的触发条件),所以Child的静态初始化块根本没执行,y还是Parent中初始的10,因此输出10。

补充:触发类主动初始化的常见场景

  • 创建类的实例对象时
  • 调用类的静态方法时
  • 访问类自身定义的静态变量(访问父类继承来的静态变量不算)
  • 通过反射强制获取类的Class对象时
  • 初始化当前类的子类时
  • 虚拟机启动时的启动类(带main方法的类)

内容的提问来源于stack exchange,提问作者Tohidur Islam Mondal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:12:39