super在多层继承中严格按原型链逐级委托,每层super只调用紧邻上一级成员,不跨层、不跳过、不自动聚合;构造时this始终为最终子类实例,任一层漏写super()即导致链中断。

当子类继承子类(即多层继承,如 A → B → C)时,super 的行为不是“跳到直接父类就停止”,而是严格按类定义时确立的原型链和静态继承关系,逐级向上委托——每层 super() 或 super.method() 都只负责调用**紧邻上一级**的对应成员,不跨层、不跳过、不自动聚合。
构造函数中 super() 按链触发,this 始终是最终子类实例
在多层继承的构造函数里,super() 是显式链条的启动点:
-
C的constructor中调super()→ 实际执行B.prototype.constructor -
B的constructor中必须也有super()→ 才会继续执行A.prototype.constructor - 若
B忘了写super(),C的初始化就会卡在B层,A完全不会运行 - 整个过程中,
this始终指向new C()创建的那个实例,所有父类构造器都是在这个实例上操作
普通方法中 super.xxx 只查父类 prototype,不穿透多层
在实例方法里,super.methodName() 不会自动找“最顶层父类”,它只从**直接父类的 prototype** 开始查找:
-
C.prototype.foo()中写super.foo()→ 查B.prototype.foo,找不到就是undefined,不会继续查A.prototype.foo - 如果
B.prototype.foo本身也写了super.foo(),那才轮到A.prototype.foo - 也就是说,每层
super只解决“我上一级是谁”,不负责“上上级在哪”
静态方法里的 super 指向父类构造函数,同样单步向上
静态上下文中的 super 行为对称但独立:
立即学习“Java免费学习笔记(深入)”;
-
C.info()中super.info()→ 调用B.info(B自身的静态方法) -
B.info()若也调super.info()→ 才会调用A.info - 静态继承链由构造函数的
[[Prototype]]决定:C.[[Prototype]] === B,B.[[Prototype]] === A
常见误区:super 不是“自动递归”,漏写就断链
多层继承下,super 的可靠性完全依赖**每一层都主动参与**:
- 某一层没写
super()(哪怕只是空构造函数),整条初始化链就在那一层中断 - 某一层方法里漏掉
super.xxx(),后续层级的逻辑就彻底丢失,不会被“自动补上” - 不能靠“最底层子类一个
super调到底”,必须每层各写各的


















