静态代码块在类加载时执行且仅一次,先于构造方法;构造方法每次创建对象时执行,位于实例变量赋值和构造代码块之后。

静态代码块总在构造方法之前执行,而且只执行一次;构造方法每次创建对象时都执行,且一定在对应类的构造代码块之后运行。
静态代码块先于所有构造逻辑
静态代码块属于类加载阶段,JVM首次主动使用该类(比如 new 实例、调用静态方法、访问静态字段)时触发。它不依赖对象创建,也不受继承关系中构造调用的影响——哪怕你从没 new 过这个类,只要触发类加载,静态代码块就立即执行。
- 父类静态代码块一定在子类静态代码块之前执行
- 同一类中多个静态代码块按源码书写顺序依次执行
- 静态变量赋值语句(如 static int x = 5;)和静态代码块平级,也参与这个阶段,顺序由定义位置决定
构造方法不是初始化起点,而是终点
构造方法本身不启动初始化流程,它只是对象成型的最后一环。真正开始实例初始化的是 new 操作:JVM会先完成父类到子类的实例变量赋值、构造代码块,然后才进入构造方法体。
- 编译器会把实例变量赋值(如 String name = "Alice";)和构造代码块({ ... })自动“插入”到每个构造方法开头,紧接在 super() 或 this() 调用之后
- 所以即使构造方法里写了复杂逻辑,它实际执行时,对象的字段早已被构造代码块和显式赋值初始化好了
- 若构造方法第一行是 this(...),那当前构造方法体不会执行,但构造代码块仍会在最终被调用的那个构造方法中执行一次
两类代码块不能混用,时机完全不同
静态代码块里不能访问任何实例成员(比如普通字段、this、非静态方法),因为它运行时还没有对象;而构造代码块和构造方法可以安全访问完整实例状态,包括父类继承来的字段。
- 静态代码块适合做一次性全局准备:加载配置、初始化连接池、设置单例引用
- 构造代码块适合抽取多个构造方法共用的初始化动作:校验参数前置条件、设置默认状态、分配轻量资源
- 构造方法专注对象特有逻辑:处理传入参数、建立业务约束、触发外部交互
验证方式很简单
写一个父子类,在各自静态块、构造代码块、构造方法里打印带类名和阶段标识的日志,比如 "父类静态块"、"子类构造代码块",然后在 main 中 new 两次子类对象。你会清楚看到:前两行(父类静态、子类静态)只出现一次;后面六行(父构块→父构→子构块→子构)重复两次——这就是最直观的执行节奏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











