super调用父类方法是显式执行父类实现,而非绕过重写;语法为super.methodName(),仅限实例方法或构造器中使用,编译时绑定父类版本,不参与运行时多态。

在 Java 中,子类重写父类方法后,无法通过 super 直接调用“被重写的方法的原始版本”来实现多态意义上的“绕过重写”,因为 super.methodName() 本身调用的就是父类中定义的那个方法(未被动态绑定的版本)——这恰恰是它的设计目的,不是“绕过重写”,而是**显式调用父类实现**。
super 调用父类方法的基本写法
只要父类中存在对应方法(无论是否被重写),子类中就可以用 super.方法名(...) 显式调用它。这是合法且常用的操作,尤其用于在重写方法中复用父类逻辑:
- 语法简单直接:
super.doWork();或super.toString(); - 只能在子类的实例方法或构造器中使用,不能在静态方法中使用
- 调用的是编译时确定的父类中的方法定义,不参与运行时多态分派
常见误区:不存在“调用被重写前的版本”这种需求
Java 的方法重写(override)本质是运行时多态:调用哪个版本,取决于对象实际类型和方法签名。但 super 不是“恢复原状”的开关,而是**明确指定调用父类声明的实现**:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 如果父类方法是
public void log() { System.out.println("Parent"); } - 子类重写为
@Override public void log() { System.out.println("Child"); } - 那么在子类中写
super.log();就会输出"Parent"—— 这就是你想要的“父类原始行为” - 这不是“绕过重写”,而是主动选择父类实现
注意:不能在静态上下文中使用 super
super 是与实例绑定的关键字,因此以下写法是错误的:
立即学习“Java免费学习笔记(深入)”;
-
static void test() { super.doSomething(); }→ 编译失败 - 若需类似效果,应让父类提供
static方法,并用ParentClass.staticMethod()调用
构造器中调用父类构造器也是 super 的典型用法
虽然不属于“调用被重写方法”,但属于 super 的核心用途之一,常与方法调用混淆:
-
super();调用父类无参构造器(必须是第一行) -
super("arg");调用父类带参构造器 - 不写
super(...)时,编译器自动插入super();(前提是父类有无参构造器)

















