Java代码块执行顺序是JVM严格规定的初始化机制,静态块在类首次主动使用时执行一次,构造块每次new对象时在构造器前执行,继承链中按父类到子类、字段→构造块→构造器顺序分层初始化。

Java 中代码块执行顺序本身不是“实现灵活性”的工具,而是 JVM 严格规定的初始化机制。所谓灵活性,其实是开发者在理解该顺序基础上,主动选择合适位置放置初始化逻辑,从而让对象创建过程更清晰、可复用、易维护。
静态代码块用于类级一次性准备
它在类首次被主动使用时执行一次,适合做全局资源加载、配置读取、常量预计算等不依赖具体对象的操作。
- 多个静态块按源码顺序执行,可分阶段初始化不同模块
- 不能访问实例成员,但能调用静态方法完成复杂初始化(如解析配置文件)
- 若某静态字段依赖方法返回值(static String cfg = loadConfig();),该方法就在静态初始化阶段运行
构造代码块统一处理所有对象的共性逻辑
每次 new 对象时,它都在构造器之前执行,天然适合作为“通用前置初始化”入口。
- 避免在多个重载构造器中重复写相同初始化语句(比如日志标记、状态重置、默认属性设置)
- 可访问实例变量和静态成员,还能调用普通方法(如 this.initDefaultValues();)
- 与字段显式初始化(private List<String> items = new ArrayList<>();)混合时,按代码书写顺序依次执行
继承链中分层控制初始化节奏
父类和子类的代码块、字段、构造器按固定路径展开,让初始化责任自然分层。
立即学习“Java免费学习笔记(深入)”;
- 父类实例部分先完成:设默认值 → 执行父类构造块 → 调父类构造器
- 子类再介入:设默认值 → 执行子类构造块 → 调子类构造器
- super() 隐式或显式出现在子类构造器第一行,是衔接父子初始化的关键锚点
用日志+断点验证执行路径,避免靠猜
实际开发中,仅凭记忆容易出错。最可靠的方式是在关键节点加标识日志:
- 每个 static {} 开头打印 "[S] 类名"
- 每个 {} 构造块开头打印 "[I] 类名"
- 每个构造器第一行打印 "[C] 类名()"
- 字段初始化表达式中的方法内部也加日志(如 loadName() 里输出)


















