普通代码块一定先于构造方法执行,且每次new对象时自动运行一次;它按类中从上到下顺序执行,仅在最终执行的构造方法前运行一次,位于父类super()之后、本类构造方法体之前,用于通用初始化。

普通代码块(即实例代码块)一定先于构造方法执行,且每次 new 对象时都自动运行一次。
普通代码块在构造方法前执行
Java 编译器会把类中所有非 static 的 {} 块(也就是普通代码块)“插入”到每个构造方法体的最开头。这意味着:无论你调用哪个构造方法,只要对象被创建,这些块就会在构造方法第一行语句之前运行。
- 多个普通代码块按它们在类中从上到下的顺序依次执行
- 即使构造方法里用了 this() 调用其他构造器,普通代码块也只执行一次——就在最终实际执行的那个构造方法开始前
- 它能访问实例变量(包括未显式赋值的字段),也能调用普通方法,但不能声明 static 成员
执行时机严格绑定对象创建
普通代码块不是靠调用触发的,而是 JVM 实例化流程的固定环节。它的执行发生在:
- 父类 super() 完成之后
- 本类构造方法体开始之前
- 和构造方法共同构成“实例初始化阶段”,不可跳过、不可并发
例如:成员变量声明处的初始化(如 String name = "Tom";)会被编译器自动挪进对应类的普通代码块中,因此也遵循同一顺序。
和构造方法的关系是嵌套而非并列
构造方法负责差异化初始化(比如根据参数设置不同状态),而普通代码块适合抽取共性逻辑(如统一日志、基础字段赋值)。两者分工明确:
- 普通代码块做“通用准备”,构造方法做“个性定制”
- 构造方法内可以写局部 {} 块,但那是作用域语法,不参与初始化流程
- 哪怕构造方法为空,普通代码块依然照常执行
父子类中顺序更清晰
当 new 子类对象时,完整链路是:
- 父类普通代码块 → 父类构造方法
- 子类普通代码块 → 子类构造方法
这个单向顺序保障了子类能安全使用已初始化的父类字段,避免读到默认值(如 null 或 0)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











