Java中子类构造器必须第一行调用super()显式调用父类构造器传参初始化,若父类无无参构造器则必须显式调用super(...),且仅能调用一次;参数可为形参、计算值或静态方法结果;多级继承需逐层委托;禁止new父类对象、setter赋值或字段块调用super()。

Java 中没有“借用构造函数”这个标准术语,实际指的是在子类构造器中通过 super() 显式调用父类构造器来完成参数传递和初始化——这是 Java 继承机制的规范做法,也是唯一合法、安全的“向父类传参”方式。
必须在子类构造器第一行调用 super()
Java 规定:如果父类没有无参构造器,子类构造器必须显式以 super(...) 开头调用父类有参构造器;即使父类有无参构造器,只要你想传特定值给父类字段,也应主动使用 super(参数)。
- 不写 super() 且父类无默认无参构造器 → 编译报错
- super() 必须是子类构造器的第一条语句 → 否则编译报错
- 一个子类构造器只能调用一次 super() → 多次调用或与 this() 混用会报错
参数来源可以是子类构造器入参或计算结果
你传给 super() 的参数不必直接等于子类构造器的形参,它可以是加工后的值、常量、甚至方法返回结果(前提是该方法不依赖未初始化的子类字段)。
- 直接转发:
super(name) - 组合拼接:
super(firstName + " " + lastName) - 条件处理:
super(age >= 0 ? age : 0) - 调用静态工具方法:
super(Validator.normalizeName(inputName))
多级继承时逐层向上委托
若存在 A ← B ← C 的继承链,C 的构造器需调用 B 的构造器,B 再调用 A 的构造器。每层都负责把必要参数“接力”传上去,不能跳过中间父类。
- C 构造器中写
super(id, name)→ 调用 B 的构造器 - B 构造器中写
super(id)→ 调用 A 的构造器 - A 构造器完成最终字段初始化
避免常见误区
有些做法看似“传参”,实则无效或危险:
- ❌ 在子类构造器里 new 父类对象再赋值 → 创建的是另一个无关实例,不影响当前子类对象的父类部分
- ❌ 用 setter 方法在 super() 后设置父类 private 字段 → 若父类字段为 private 且无 public/protected setter,则不可行;即使有,也不如构造器初始化语义清晰、线程安全
- ❌ 试图在子类字段初始化块中调用 super() → 语法非法,super() 只能在构造器首行出现










