静态代码块最先执行且仅一次,构造代码块次之每次new都执行并在构造方法前,构造方法最后执行完成对象初始化;三者顺序由jvm类加载和实例化机制严格决定。

区分这三者的执行顺序,关键看它们各自触发的时机:静态代码块依赖类加载,构造代码块绑定对象创建,构造方法则在对象初始化过程中被显式或隐式调用。
静态代码块最先执行,且只执行一次
它在类第一次被 JVM 加载时运行,不依赖任何对象实例。哪怕只访问一个静态字段、调用一个静态方法,或者执行 new 操作前,只要该类尚未加载,就会触发静态代码块。父类静态代码块一定先于子类执行,同一类中多个静态代码块按定义顺序依次执行。
- 适合做一次性初始化,比如加载数据库驱动、读取全局配置
- 不能访问非静态成员(因为此时还没有对象)
- 即使 main 方法里没 new 对象,只要引用了该类的静态内容,它就执行
构造代码块每次 new 对象时都执行,且在构造方法之前
它没有名字、不带 static、直接写在类体中用 {} 包裹。编译后会被“插入”到每个构造方法的第一行(在 super() 或 this() 调用之后、构造方法体开始之前)。所以它属于对象级别,每次创建新实例都会走一遍。
- 可以访问静态和非静态成员
- 父类构造代码块先于子类执行
- 常用来抽取多个构造方法共有的初始化逻辑,避免重复代码
构造方法在构造代码块之后执行,完成最终对象状态设定
它负责接收参数、校验输入、分配资源、设置业务相关属性等具体工作。每个构造方法内部,super() 或 this() 是隐式或显式的首条语句;而 super() 的执行会先触发父类的构造代码块和构造方法,再回到本类继续执行本类的构造代码块和构造方法。
- 子类构造方法一定等父类构造方法完全返回后才继续执行后续语句
- 一个类可有多个重载构造方法,但每个 new 实例只会调用其中一个
- 构造代码块是“通用前置”,构造方法是“定制化收尾”
不复杂但容易忽略:执行顺序不是靠代码书写位置决定的,而是由 JVM 类加载机制和对象实例化流程严格控制的。理解这点,就能一眼看出日志输出的先后逻辑。










