super调用被覆盖的父类方法需在子类方法体内显式使用super.方法名()(Java)或super().方法名()(Python),确保父类方法存在且访问权限允许,不能用于静态方法或私有方法。

在子类中用 super 关键字调用被覆盖的父类方法,核心是明确指定“让父类版本执行”,避免子类重写后默认只走自己的逻辑。
super 调用被覆盖的方法要写在子类方法内部
不是声明时加 super,而是在子类方法体里用 super.方法名() 主动触发父类实现。Java 和 Python 的语法略有不同,但思路一致。
-
Java 中直接写
super.方法名(参数)
比如父类Animal有makeSound(),子类Dog重写了它,但仍想复用父类逻辑:class Dog extends Animal { @Override void makeSound() { super.makeSound(); // 先执行父类的 makeSound() System.out.println("Woof!"); // 再执行子类新增行为 } } -
Python 中用
super().方法名(参数)
注意括号不能省,且通常放在方法开头或合适位置:class Dog(Animal): def make_sound(self): super().make_sound() # 调用父类同名方法 print("Woof!")
必须确保父类中存在该方法,且访问权限允许super 只能调用父类中可见(如 public/protected 在 Java,或非私有在 Python)的方法。如果父类方法是 private(Java)或以双下划线开头(Python 的名称改写),super 就无法访问。
不能在静态上下文中用 super 调用实例方法
比如在 static 方法里写 super.xxx() 会编译报错。super 是基于对象实例的,只适用于实例方法内部。
调用时机由你控制,不自动发生
重写方法后,父类版本不会自动执行。哪怕只想要父类逻辑、完全不加新代码,也得显式写 super.xxx(),否则就真的只运行子类内容。

















