java代码块执行顺序为:静态代码块→实例代码块→构造器→普通代码块;静态块在类加载时执行一次,实例块每次new对象时在构造器前执行,普通块仅按方法内顺序执行。

Java代码块执行顺序是面试高频考点,核心在于分清三类块的触发时机和作用域:静态代码块、实例代码块(构造块)、普通代码块。它们不是并列关系,而是按加载阶段和对象生命周期严格排序的。
静态代码块:类加载时执行,仅一次
static {} 块在JVM首次主动使用该类(如new对象、调用静态方法、访问静态字段)时触发,随类加载而执行,且整个程序中只运行一次。多个静态块按源码书写顺序依次执行。它不能访问实例成员,适合做全局初始化,比如注册JDBC驱动、加载配置、初始化静态缓存。
- 父类静态块一定先于子类静态块执行
- 即使没创建对象,只要类被引用(如调用main或静态方法),也会触发
- 静态变量赋值语句(如 public static String s = "a";)与静态块同级,按出现顺序执行
实例代码块:每次new对象时执行,优先于构造方法
{} 块(无static修饰)属于对象级别,在每次调用构造方法前自动执行,编译器会将其“插入”到每个构造方法体的最开头。它可访问实例变量和方法,常用于抽取多个构造器共有的初始化逻辑。
- 父类实例块 → 父类构造方法 → 子类实例块 → 子类构造方法
- 实例变量声明赋值(如 String name = "Tom";)与实例块同级,按定义顺序执行
- 它不依赖构造方法位置——哪怕写在构造方法后面,仍会在构造方法体之前运行
普通代码块:方法内局部作用域,按顺序执行
出现在方法、构造器或语句中的 { … } 就是普通代码块,本质是作用域控制语法,和初始化无关。它没有特殊执行时机,只遵循代码从上到下的自然顺序,变量也仅在块内可见。
- 不属于类初始化流程,不会影响对象创建顺序
- 常见用途:限制变量生命周期、配合try-catch、组织逻辑段落
- 例如main里两个相邻的{},谁先写就谁先执行,与类结构完全无关
继承场景下的完整执行链
当存在父子类继承且执行 new Child() 时,实际顺序为:
- 父类静态块(含静态变量初始化)
- 子类静态块(含静态变量初始化)
- 父类实例块(含实例变量初始化)
- 父类构造方法
- 子类实例块(含实例变量初始化)
- 子类构造方法
这个链条体现了JVM对类加载和对象构建的分阶段处理:先确保类结构就绪(静态阶段),再逐层完成对象实例化(实例阶段)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











