必须用super调用父类方法的情形是子类需在父类逻辑基础上扩展功能,如初始化、校验、日志或资源释放;构造器中若父类无无参构造则首行必须super(...);普通重写方法中super调用位置自由,静态方法不可重写故super调用无多态意义。

子类重写父类方法后,若需在子类方法中执行父类的原始逻辑,可使用 super.方法名() 显式调用父类被重写的方法。
什么时候必须用 super 调用?
当子类方法需要“在父类逻辑基础上扩展”时,比如初始化、校验、日志或资源释放等场景。不调用 super 就会完全覆盖父类行为,丢失原有功能。
- 构造方法中,若父类无无参构造,子类构造器第一行必须写
super(...) - 普通方法重写中,
super调用位置自由(不强制第一行),按业务逻辑决定何时执行父类逻辑 - 静态方法不能被重写,因此
super.静态方法()实际调用的是父类字面量对应的静态方法,与多态无关
正确写法示例
假设父类 Animal 有 makeSound() 方法,子类 Dog 重写它并补充行为:
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks"); // 子类新增逻辑
super.makeSound(); // 主动调用父类原逻辑
}
}
运行 new Dog().makeSound() 会输出:
Animal makes a sound
常见误区提醒
-
super不是对象,不能赋值给变量,也不能用super = ...赋值 - 不能在
static方法中使用super,因为super依赖实例上下文 - 重写方法签名(名称、参数列表)必须与父类严格一致;返回类型可协变(如父类返回
Animal,子类可返回Dog),但super调用仍按父类声明类型处理 - 如果父类方法是
private或final,子类无法重写,自然也无法通过super调用——此时编译报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











