子类构造函数中不调用 super() 会直接报错:javascript 报 referenceerror,java 编译失败,python 运行时 attributeerror;唯有不声明构造函数时,语言才自动插入 super() 完成父类初始化。

子类构造函数中不调用 super(),会直接报错——不是警告,也不是运行时逻辑异常,而是明确的 ReferenceError(JavaScript)或编译错误(Java/Python 等语言),程序根本无法完成实例化。
JavaScript 中:this 未初始化,禁止访问
ES6 类机制要求:子类构造函数执行时,this 在 super() 返回前处于“未绑定”状态。任何对 this 的操作(包括赋值、读取、console.log(this))都会触发错误:
ReferenceError: Must call super constructor in derived class before accessing 'this'- 即使构造函数为空:
constructor() { },只要显式写了constructor,就必须首行写super() -
super()不仅调用父类逻辑,还负责设置子类实例的[[Prototype]]和内部槽位,是 this 能被安全使用的前提
Java 中:编译失败,无法生成字节码
Java 编译器强制要求子类构造函数第一行必须是 super(...) 或 this(...)。若未显式写出,编译器会自动插入 super()(调用父类无参构造);但前提是父类**存在无参构造**:
- 若父类只有带参构造,而子类没写
super(参数)→ 编译报错:Constructor Parent() is undefined - 若写了
this(...),它内部仍会隐式调用super(...),所以跳过父类初始化仍是不可能的 - 本质是对象初始化链不可中断:JVM 必须先完成父类部分的内存布局和字段初始化,才能构建子类实例
Python 中:父类属性缺失,运行时出错
Python 不在语法层面强制检查,但后果同样严重:
- 父类
__init__中定义的实例属性(如self.name)不会被创建 - 后续访问这些属性会抛出
AttributeError,例如obj.name报错 - 在多继承中,不调用
super().__init__()还会导致 MRO 链断裂,某些父类初始化被完全跳过,引发难以排查的状态不一致
不写 constructor 就没事?
是的——这是唯一绕过该限制的方式:
- JavaScript:子类不定义
constructor,引擎自动提供constructor(...args) { super(...args); } - Java:不写构造函数,编译器自动添加默认无参构造,并插入
super() - Python:不重写
__init__,则直接沿用父类的初始化逻辑 - 但一旦你主动声明了构造函数,就意味着你要接管初始化流程,而
super()就是你向父类“交接控制权”的必经步骤











