super.方法名()用于子类重写方法中调用父类原始实现,前提为该方法是public/protected、非static、非private、非final,且签名完全匹配;不能在静态方法或构造器外使用。

super 调用被重写的父类方法的语法和前提条件
必须在子类的重写方法内部,用 super.方法名() 显式调用父类原始实现;不能在静态上下文、构造器外的静态方法、或父类未定义该方法的情况下使用。Java 不允许通过 super 调用与当前方法签名不匹配的父类方法(哪怕重载存在),只认「同名 + 同参数类型 + 同返回类型」的直接父类版本。
常见错误:super() 和 super.方法名() 混用导致编译失败
super() 是调用父类构造器,只能出现在子类构造器第一行;而 super.方法名() 是调用父类实例方法,只能出现在实例方法体中。两者语义完全不同,混用会报错:
-
super.toString()在普通方法里合法;super.toString()写在构造器第一行以外的位置,编译不过 - 在静态方法里写
super.method()→ 编译错误:non-static method method() cannot be referenced from a static context - 父类方法是
private,子类里写super.privateMethod()→ 编译错误:cannot resolve symbol
为什么不能在任意位置用 super 访问父类方法?
因为 super 不是对象引用,而是编译期绑定的「父类视角 this」,它依赖当前方法的运行时类型(即子类实例)和编译时类型(即父类声明)。它的作用域严格受限于继承链和访问控制:
- 仅对
protected或public的父类成员有效;default(包级)成员仅在同包时可用 - 如果父类方法被子类重写,
super.方法名()绕过动态绑定,强制执行父类版本;但若没重写,super.方法名()和this.方法名()效果一致 - 无法用
super调用祖父类的方法(如 A ← B ← C,C 中不能super.super.method())
实际调试中容易忽略的细节
当父类方法有副作用(比如修改字段、打印日志、触发回调),用 super.方法名() 会真实执行它——这点常被当成“安全委托”误用。更隐蔽的是:如果父类方法本身又调用了被子类重写的另一个方法,那这次调用仍会走子类版本(即仍发生动态绑定),super 只影响直接调用的那一层。
立即学习“Java免费学习笔记(深入)”;
例如:父类 process() 内部调用 validate(),子类重写了 validate();那么子类中 super.process() 执行时,内部的 validate() 调用仍进入子类重写版——这不是 bug,是 Java 多态的本质表现。


















