Java对象实例化执行顺序为:父类静态块→子类静态块→父类普通块→父类构造方法→子类普通块→子类构造方法。该顺序确保静态优先于实例、父类优先于子类,且普通块在构造方法体前执行,用于统一初始化共性状态。

Java中对象实例化不是简单的一句 new 就完事——它背后有一套严谨、可预测的初始化流程。用对构造方法和初始化块,能让你精准控制对象“出生”时的状态;用错顺序或混用静态与实例逻辑,则容易引发空指针、值未初始化、甚至类加载失败等问题。
构造方法:专为对象定制的初始化入口
构造方法是每个对象诞生时必经的“出厂设置环节”。它必须满足三个硬性条件:名称与类名完全一致(大小写敏感)、无返回类型(连 void 都不能写)、不能用 static 修饰。
- 如果你没写任何构造方法,编译器会自动补一个无参、空体的默认构造方法;但只要你定义了任意一个构造方法,这个默认构造就会消失——此时若其他代码仍调用无参
new,就会编译报错 - 多个构造方法靠参数列表区分(重载),比如
Person()、Person(String name)、Person(String name, int age),JVM根据实参类型和个数自动匹配 - 构造方法内可调用
this(...)实现本类构造链(必须是第一行),也可用super(...)显式调用父类构造(否则默认插入super())
普通初始化块:提取共性逻辑,避免构造方法重复
当多个构造方法都需要执行相同初始化代码(比如生成唯一ID、设置默认状态、校验基础字段),把这些代码写进每个构造方法里既冗余又易错。这时就该用普通初始化块——用 { ... } 包裹,不加 static。
- 它在每次
new对象时执行,且严格位于父类构造方法返回之后、本类构造方法体开始之前 - 块内可安全访问
this和实例变量,也能调用实例方法(但注意:若该方法被子类重写,此时子类字段尚未初始化,可能出问题) - 多个普通块按源码自上而下顺序执行,效果等同于把它们“插”进每个构造方法开头
静态初始化块:只跑一次的类级准备动作
有些操作跟具体对象无关,只和整个类相关——比如加载配置、初始化工具类、设置全局计数器。这类任务适合放在 static { ... } 块中。
立即学习“Java免费学习笔记(深入)”;
- 它随类首次主动使用(如首次
new、首次访问静态成员、首次反射加载)而触发,在类加载的初始化阶段执行,且仅执行一次 - 静态块和静态变量赋值语句按源码顺序合并进 JVM 的
<clinit>方法,父类静态部分一定先于子类执行 - 切忌在静态块中依赖尚未声明或初始化的静态字段,也不要在其中调用可能触发类再初始化的方法
执行顺序必须牢记:从类到对象,从静态到实例
创建一个子类对象时,完整流程是分层推进的:
- 先走类加载:父类静态变量默认值 → 父类静态变量赋值 + 静态块(从上到下)→ 子类静态变量默认值 → 子类静态变量赋值 + 静态块
- 再走对象实例化:父类实例变量默认值 → 父类实例变量赋值 + 普通块(从上到下)→ 父类构造方法体 → 子类实例变量默认值 → 子类实例变量赋值 + 普通块 → 子类构造方法体
调试时建议在各处打带标识日志(如 [S]、[I]、[C]),观察输出是否符合预期,比死记口诀更可靠。


















