子类对象创建时构造器调用顺序严格从object开始逐层向下,super是编译期强制的初始化契约;super()必须首行调用且不可与this()共存,用于初始化当前对象的父类部分而非创建新实例。

Java继承中,子类对象创建时的构造器调用顺序是严格固定的:从最顶层的Object开始,逐层向下执行父类构造器,最后执行子类构造器。而super关键字正是控制这一链条的核心机制——它不是可选语法糖,而是编译期强制执行的初始化契约。
构造器链必须从父类开始
每个子类构造器在执行自身逻辑前,必须完成父类部分的初始化。这个过程通过构造器链实现:
- 若子类构造器未显式写
super(...)或this(...),编译器自动插入super()(调用父类无参构造器) - 如果父类没有无参构造器,且子类没写
super(参数),编译直接失败 -
super()或this()只能出现在第一行,且二者互斥——因为对象状态尚未建立,不能允许歧义的初始化路径
super()不是创建新对象,而是初始化当前对象的父类部分
调用super(...)时,并不会生成一个独立的父类实例。它只是把当前正在构建的对象(由new分配的内存)交由父类构造器来填充其继承来的字段和行为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如
Student extends Person,new Student("张三", 20)只创建一个对象,super("张三")只是让Person的构造逻辑初始化该对象中的name字段 - 父类构造器执行完毕后,该对象才具备完整的“父类特征”,子类构造器才能安全地操作继承来的成员
super在非构造场景中用于明确访问父类成员
在普通方法或代码块中,super的作用是绕过子类重写,直接调用父类版本:
-
super.methodName():调用父类被重写的方法(如子类重写了toString(),但想复用父类逻辑时) -
super.fieldName:访问被子类同名字段遮蔽的父类字段(注意不能访问private成员) - 静态上下文中不能用
super;super也不能出现在静态方法或静态代码块中
常见错误与规避方式
多数编译或运行时问题源于对super时机和作用域的误判:
- 在构造器里把
super(...)写在第二行——编译报错:“call to super must be first statement” - 父类只有带参构造器,子类却没写
super(...)——编译报错:“constructor Parent() is undefined” - 在子类静态方法中写
super.xxx——编译报错:“Cannot use super in a static context” - 试图用
super访问父类private成员——编译报错,权限检查在编译期就拒绝
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










