可以,super最典型用途是子类重写方法中显式调用父类被重写的方法,实现复用加增强;必须在非静态方法中使用,且父类方法不能是private、static或final。

可以,而且这是 super 最典型、最实用的用途之一。
调用被重写的父类方法是合法且推荐的做法
当子类用 @Override 重写了父类的某个实例方法(public 或 protected),就可以在子类方法体内通过 super.方法名() 显式调用父类原始实现。这属于“扩展式重写”,不是替代,而是复用加增强。
- 必须在子类的非静态方法中使用,不能出现在 static 方法或静态代码块里
- 父类方法不能是
private(子类不可见)、static(不参与重写)或final(禁止重写) - 参数类型、数量、顺序必须与父类方法完全一致,编译器会做严格匹配
- 调用时绕过动态绑定,直接执行父类定义的那个版本,不会再次进入子类重写的方法
常见使用模式:先父后子
多数场景下,子类希望保留父类基础逻辑,再追加自己的处理。例如:
- 重写
toString()时,用super.toString()获取父类字段格式,再拼接子类特有内容 - 重写
save()时,先super.save()完成通用持久化,再更新子类关联数据 - 重写事件回调如
onCreate()(Android 场景),必须先调super.onCreate()确保框架初始化
注意区分 super 和 this 的行为差异
在子类重写方法内部:
立即学习“Java免费学习笔记(深入)”;
-
super.method()→ 固定调用父类声明的版本,不看运行时对象类型 -
this.method()或直接写method()→ 触发动态绑定,仍会走到当前对象实际类型的最终重写版(可能就是本方法自己,导致递归)
所以,想安全复用父类逻辑,必须用 super,不能依赖 this。
不能用 super 的几种典型情况
- 父类方法是
private:编译报错 “cannot resolve symbol” - 在静态方法里写
super.xxx():编译报错 “non-static method cannot be referenced from a static context” - 构造器中非首行写
super.xxx():语法错误,super()调构造器才必须首行,super.方法名()只能在实例方法体中任意位置 - 试图调祖父类方法,如
super.super.xxx():Java 不支持多级 super 调用


















