子类对象实例化全过程为:父类静态变量→父类静态块→子类静态变量→子类静态块→父类实例变量→父类实例块→父类构造器→子类实例变量→子类实例块→子类构造器;静态部分仅执行一次,实例部分每次new均执行。

子类对象实例化不是简单执行一个构造方法,而是贯穿类加载、内存分配、字段初始化、构造调用的完整链条。核心在于:父类必须先就位,子类才能安全构建。
类加载与静态准备阶段
当首次用 new Child() 创建子类对象时,JVM 先确保整个继承链的类已加载进方法区。顺序是:先加载父类(如 Parent),再加载子类(如 Child)。此时,所有 static 成员和静态代码块按声明顺序从父到子依次执行——父类静态块 → 子类静态块。这个阶段不涉及任何对象,只和类本身有关。
堆内存分配与字段默认初始化
JVM 在堆中为子类对象开辟连续空间,包含两部分字段:继承自父类的(即使 private,也有对应内存位置)和子类自己声明的。此时所有字段被赋予默认值:int → 0,Object → null,boolean → false。注意:这步发生在任何构造器执行之前,且对父类字段和子类字段一视同仁。
构造器链式调用与显式初始化
接下来进入最关键的构造阶段,严格遵循“自顶向下、再自底向上”的逻辑:
- 子类构造器第一行隐含或显式调用 super(...),跳转至父类构造器
- 父类构造器内部,先执行父类的实例代码块({...}),再执行父类构造器语句体
- 父类构造完成,控制权回到子类构造器,执行子类的实例代码块,再执行子类构造器语句体
例如,若父类构造中调用了被子类重写的方法,此时子类字段虽已分配内存但尚未显式赋值(仍为默认值),可能引发意料之外的结果——这是面试常考点。
引用赋值与对象可用
整个构造链顺利结束后,JVM 将堆中该对象的内存地址赋给栈中的引用变量(如 Child c = new Child(); 中的 c)。此时对象才真正“活”起来,可以安全调用方法、访问字段。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











