子类构造函数第一行必须调用super()以初始化父类,若父类无无参构造器则需显式调用带参super(参数),且super()必须为首条语句、不可与this()共存、参数须精确匹配父类构造器签名。

在 Java 中,子类构造函数第一行调用 super() 是为了显式调用父类的构造方法,确保父类部分被正确初始化。如果子类构造器中没写 super(...),编译器会自动插入无参的 super() —— 但前提是父类有无参构造器;否则编译失败。
必须显式调用 super 的情况
当父类**没有无参构造器**,只有带参构造器时,子类构造器必须在第一行用 super(参数) 调用其中一个父类构造器。
- 父类定义了任意构造器(哪怕只有一个带参构造器),编译器就不会自动生成默认无参构造器
- 此时子类若不写
super(...),编译器仍试图插入super(),但找不到匹配方法 → 编译错误 - 例如:父类只有
public Parent(String name) { ... },子类就必须写super("xxx")
super() 必须是第一行语句
Java 规定:super(...) 或 this(...) 必须是构造器中**第一条可执行语句**,否则编译报错。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不能在 if、for、变量声明之后写;也不能和普通代码混写
- 不能同时出现
super(...)和this(...)(二者互斥) - 错误示例:
int x = 1; super();→ 编译不通过
传参要匹配父类构造器签名
调用 super(...) 时,括号内的实参类型、个数、顺序必须与父类某个构造器完全一致。
立即学习“Java免费学习笔记(深入)”;
- 支持自动类型提升(如 int → long),但不支持自动装箱/拆箱跨类型匹配(如 int → Integer 不行,除非父类构造器明确接受 Integer)
- 可以传常量、字段、方法返回值(只要该方法不依赖未初始化的子类状态)
- 注意:不能在
super(...)中调用子类重写的方法(因为此时子类对象尚未初始化完成,可能导致空指针或逻辑错误)
常见错误与修复
典型问题包括“Implicit super constructor is undefined”、“Call to super must be first statement”等。
-
错误:父类只有
Parent(int id),子类写new Child()且子类构造器没写super(...)→ 修复:在子类构造器首行加super(0)或其他合法值 -
错误:子类构造器先写了日志打印再写
super(...)→ 修复:把super(...)移到最前面 -
错误:父类构造器抛出异常,子类
super(...)没加throws声明 → 修复:子类构造器也声明相同异常,或用 try-catch 包裹(但不推荐,因 super 必须第一行,无法 try)

















