super()必须是子类构造器的第一条语句,因jvm/ts编译器要求父类初始化优先,确保字段赋值、final初始化及this可用性;位置错误、参数不匹配或未调用均导致编译失败。

super() 必须是子类构造器的第一条语句
Java 和 TypeScript 中,super() 调用父类构造器时,编译器强制要求它出现在子类构造器的最开头。如果放在变量声明、if 判断或任何其他语句之后,会直接报错:Constructor call must be the first statement in a constructor。
这是因为子类实例在初始化前,必须先确保父类部分已正确构建(比如父类字段赋值、final 字段初始化等)。JVM/TS 编译器需要明确知道“父类状态何时就绪”。
- 错误写法:
let x = 1; super(x);→ 编译失败 - 正确写法:
super(props); this.x = 1; - 若需预处理参数,提前计算并赋给临时变量,再传给
super(),例如:const normalized = validate(input); super(normalized);
不传参或传参必须严格匹配父类构造器签名
super() 的参数列表必须与父类中某个可访问的构造器完全一致——包括数量、类型、顺序。Java 不支持默认参数,TypeScript 虽有可选参数,但调用时仍需满足重载解析规则。
常见陷阱是父类只有带参构造器(比如 Parent(String name)),而子类写了无参构造器却忘了显式调用 super("default"),此时编译器不会自动插入 super(),而是直接报错:Implicit super constructor Parent() is undefined。
- 父类只有
Parent(int id)→ 子类必须写super(42)或super(someId) - 父类有
Parent()和Parent(String name)→ 子类可选super()或super("a") - TypeScript 中若父类构造器含可选参数(
constructor(name?: string)),super()可不传参,但super(undefined)和super()行为相同
在 React 类组件中,super(props) 不只是形式,还影响 this.props 初始化
React v16.8 之前,类组件的 constructor 中若写 super() 而非 super(props),会导致 this.props 在构造器内为 undefined,即使 render 中能正常访问。这是因为在 React 底层,this.props 是在调用 super(props) 时才挂载到实例上的。
- 错误:
constructor() { super(); console.log(this.props); // undefined } - 正确:
constructor(props) { super(props); console.log(this.props); // ✅ 正常输出 } - 即使没用到
props,也建议统一写super(props),避免后续修改时遗漏
ES6 class 中 super() 和 this 的使用边界很严格
在子类构造器中,一旦调用 super(),才能访问 this;未调用前访问 this 会抛出 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。
这个限制不仅针对显式 this.xxx,还包括 typeof this、this?.x(可选链)、甚至 console.log(this) —— 只要引用了 this 就会触发。
- 错误:
console.log(this); super(); - 正确:
super(); console.log(this); - 箭头函数里捕获
this同样受限,因为this绑定发生在函数执行时,而构造器执行时this尚未就绪
super() 看似简单,但它的位置、参数、与 this 的时序关系,任何一个环节错位都会导致编译失败或运行时异常——尤其是跨语言(Java/TS/JS)时,各环境对“构造器链完整性”的检查逻辑并不完全一致。










