java代码块执行顺序由jvm类加载和对象创建两阶段严格驱动:先类初始化(静态变量默认值→静态赋值与静态块,父类优先),再实例初始化(实例变量默认值→实例赋值与实例块→构造器,自顶向下进入、自底向上返回)。

Java代码块执行顺序不是靠记忆口诀,而是由JVM类加载和对象创建两个阶段严格驱动的。关键在于分清“类初始化”和“实例初始化”——前者只发生一次,后者每次new都触发;前者走静态逻辑,后者走实例逻辑。
静态代码块与静态变量按源码顺序合并进
类被首次主动使用时(比如调用静态方法、访问静态字段、new实例等),JVM才执行初始化阶段,并合成一个
- 准备阶段只设默认值(0、null、false),不执行任何Java代码
- final static基本类型常量(如public static final int MAX = 100;)是编译期常量,不触发类初始化
- 若静态字段初始化依赖方法调用(如static String s = init();),该方法会在
中执行
实例代码块、成员变量与构造器按继承链逐层展开
每次new对象时,JVM沿继承链自顶向下进入、自底向上返回:先完成父类实例部分,再执行子类实例部分。
- 父类实例变量设默认值 → 父类实例变量显式赋值 + 实例块(从上到下)→ 父类构造器体
- 子类实例变量设默认值 → 子类实例变量显式赋值 + 实例块(从上到下)→ 子类构造器体
- super()是隐式或显式的第一条语句,它把控制权交给父类构造流程
父子类混合场景下的完整执行流
当执行new Child()时,实际触发两轮初始化:先类初始化(静态部分),再对象初始化(实例部分)。完整顺序固定为:
- 父类静态变量默认值 → 父类静态赋值与静态块(上到下)
- 子类静态变量默认值 → 子类静态赋值与静态块(上到下)
- 父类实例变量默认值 → 父类实例赋值与实例块(上到下)→ 父类构造器
- 子类实例变量默认值 → 子类实例赋值与实例块(上到下)→ 子类构造器
用日志锚定每个环节验证执行路径
不要猜测,直接打点。在四类位置加带标识的日志:
- 每个static {}开头写"[S] Parent"
- 每个实例块开头写"[I] Parent"
- 每个构造器第一行写"[C] Parent()"
- 每个成员变量初始化表达式中的方法里也加日志(如String s = loadName();,在loadName里输出)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











