子类对象实例化顺序是:父类静态→子类静态→父类实例→父类构造器→子类实例→子类构造器;JVM为整个继承链分配单块堆内存,super()强制确保父类初始化完成后再执行子类逻辑。

子类对象实例化不是“先建子类、再补父类”,而是从根(Object)开始逐层向上准备,再由上至下初始化——这个顺序决定了属性值、方法调用、构造逻辑的最终表现。
一、实例化本质:一个对象,多层初始化
用 Zi z = new Zi(); 创建子类对象时,JVM只在堆中分配一个对象空间,但这个空间里同时包含父类声明的字段和子类声明的字段。它不是两个对象,而是一个对象承载了继承链上所有可访问的成员结构。
- 父类字段(如
int num)和子类字段(如另一个int num)各自独立存在,内存中不覆盖,只是同名时访问需靠super或this区分 - 构造过程必须确保父类部分先就绪,否则子类依赖的父类状态可能为默认值(如
0、null),导致逻辑错误
二、执行顺序:静态 → 实例 → 构造器链
整个过程分两大阶段:类加载时的静态初始化,以及 new 时的实例初始化。后者才是“对象诞生”的核心:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 父类静态块 & 静态变量 → 子类静态块 & 静态变量(类首次使用时触发,只执行一次)
- 父类实例变量默认初始化(0 / null / false)
- 父类实例代码块
-
父类构造器(隐式或显式
super()) —— 此时若父类构造器中调用了被子类重写的方法,会执行子类版本,但子类字段尚未显示初始化(仍为默认值) - 子类实例变量默认初始化
- 子类实例代码块
- 子类构造器主体
三、关键细节:super() 不是可选项,而是强制链
每个子类构造器第一行,要么是显式的 super(...),要么是隐式的 super();如果写了 this(...),那它调用的另一个本类构造器里,也必须有 super(...) 或隐式 super()。目的只有一个:确保父类初始化完成。
立即学习“Java免费学习笔记(深入)”;
- 没有
super(),父类字段就得不到正确初始值(比如父类构造器把name设为"Unknown",不调用它,该字段就是null) -
super()必须在第一行,否则编译失败;它代表对父类构造逻辑的“委托”,不是普通方法调用 - 若父类没有无参构造器,子类必须显式调用带参的
super(x, y),否则编译报错
四、常见误区:this 和 super 指向的是同一块内存
this 和 super 都指向当前正在构建的那个对象,不是两个不同对象。它们的区别在于视角不同:
-
this.num访问的是子类定义的num字段(若存在) -
super.num访问的是父类定义的num字段(即使同名) - 当父类方法被子类重写,且父类构造器中调用该方法,运行时实际执行的是子类重写后的方法(多态体现),但此时子类自己的字段可能还没赋值(仍为默认值)——这是面试高频陷阱

















