java中代码块与构造函数执行顺序为:父类静态代码块→子类静态代码块→父类构造代码块→父类构造函数→子类构造代码块→子类构造函数;静态代码块仅类加载时执行一次,构造代码块和构造函数每次new时执行,且父类优先于子类。

Java 中代码块和构造函数的执行顺序,核心在于区分“类初始化”和“对象初始化”两个阶段——前者只发生一次,后者每次 new 都触发;且父类永远先于子类完成各自阶段。
静态代码块最先执行,仅一次
静态代码块(static{})属于类级别,在类首次被主动使用(如 new、调用静态方法、访问非 final static 字段)时由 JVM 加载并执行。它不依赖对象,也不可访问实例成员。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 父类静态代码块 → 子类静态代码块(按声明顺序依次执行)
- 整个过程只发生一次,后续创建再多对象也不会重复
- 若其中抛出未捕获异常,类初始化失败,后续所有对该类的访问都会直接报 ExceptionInInitializerError
构造代码块在构造函数之前运行
构造代码块({},无 static)属于实例级别,每次 new 对象时都会执行,且严格位于对应构造函数体的第一行之前(编译器会自动将其插入到每个构造器开头,super() 调用之后)。
- 父类构造代码块 → 父类构造函数 → 子类构造代码块 → 子类构造函数
- 同一类中多个构造代码块,按源码从上到下顺序执行
- 即使构造器中用了 this() 调用其他重载构造器,构造代码块也只执行一次——就在最终实际执行的那个构造器开始前
构造函数是对象初始化的最后一步
构造函数负责差异化初始化,比如根据参数设置不同状态。它总是在本类构造代码块之后执行,且受继承链约束:每个构造函数第一行默认或显式含 super() 或 this()。
- 子类构造函数未写 super(),编译器自动插入 super(),从而触发父类完整初始化流程
- 父类构造器中若调用被子类重写的方法,此时子类字段尚未初始化(仍为 null / 0),容易引发空指针或逻辑错误
- 成员变量声明处的赋值(如 String name = "Tom";)会被编译器自动“挪进”构造代码块,因此也遵循相同顺序
一句话理清完整流程
以 new Child() 为例,执行流是:
父类静态代码块 → 子类静态代码块 → 父类构造代码块 → 父类构造函数 → 子类构造代码块 → 子类构造函数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










