super关键字是显式调用父类方法的唯一可靠方式,必须用super.methodName();在重写方法中用this或省略会导致调用子类自身版本,可能引发栈溢出。

用 super 关键字显式调用,这是唯一可靠的方式。
必须用 super.methodName(),不能靠 this 或省略
子类一旦重写了父类方法,this.methodName() 或直接写 methodName() 都会调用子类自己的版本,不是父类的。如果不小心在子类方法里又写了个 this.xxx(),而这个 xxx 又间接回到当前方法,就容易栈溢出。
- 正确写法:
super.show(); - 错误写法:
this.show();或show();(在已重写的方法内部)
super 的使用有明确限制
它只在非静态、可访问的实例方法中有效:
- 父类方法是
private:不可见,super.xxx()编译不通过 - 父类方法是
static:不能用super.staticMethod(),得用ParentClass.staticMethod() - 父类方法是
final:可以调用,但没必要写super,因为没被重写,this.xxx()效果一样 - 在
static方法里不能出现super
常见合理调用时机
通常不是“要不要调”,而是“什么时候调”更关键:
立即学习“Java免费学习笔记(深入)”;
- 在子类方法开头调用:
super.init();→ 先完成父类初始化逻辑,再执行子类扩展 - 在子类方法结尾调用:
super.cleanup();→ 先处理子类资源,再交由父类收尾 - 只调一次,避免嵌套或循环引用(比如 A 调 B,B 又反过来调 A 的某个方法)
构造器里也要用 super()
子类构造器第一行如果没写 this(...),编译器会自动加 super();但若父类没有无参构造器,就必须显式写 super(参数),且必须是首句。
- 例如:
super(name, age);必须出现在子类构造器第一行 - 不能和
this(...)同时出现


















