子类调用父类实例方法必须用super(),且仅限非静态方法;private、static、final方法有特殊限制:private不可见,static不参与多态需用类名调用,final不可重写但可直接调用。

子类直接调用父类实例方法要用 super
子类重写了父类方法后,想在子类方法里执行父类的原始逻辑,必须显式用 super.methodName()。不写 super 就会递归调用自己,很可能触发 StackOverflowError。
常见错误是以为“不重写就自动走父类”,但一旦子类定义了同名方法,哪怕只加了一行日志,也必须靠 super 主动拉取父类实现。
-
super只能在非静态方法中使用,不能在static方法里出现 - 构造器里调用父类构造器也用
super(...),且必须是第一行语句 - 如果父类方法是
private,子类无法通过super访问——它根本不可见
父类方法被 static 修饰时不能用 super 调用
static 方法属于类本身,不参与多态,也没有运行时绑定。子类中即使声明同签名的 static 方法,也只是“隐藏”(hiding),不是重写(overriding)。
所以不能写 super.staticMethod() —— 编译直接报错:non-static method cannot be referenced from a static context 或类似提示。
立即学习“Java免费学习笔记(深入)”;
- 调用父类
static方法,应直接用类名:ParentClass.staticMethod() - 子类中的同名
static方法与父类完全独立,彼此无关联 - 哪怕子类没定义该
static方法,也能通过子类名调用父类的,因为可继承
父类方法被 final 修饰时子类只能调用不能重写
final 方法禁止被子类覆盖,但不影响调用。子类对象可以直接通过 this.methodName() 或隐式调用(不写 this)来执行它。
此时写 super.methodName() 语法合法,但没必要——效果和 this.methodName() 完全一样,因为没有重写发生。
- 如果子类试图重写
final方法,编译报错:cannot override a final method -
final方法仍可被子类继承并访问(除非是private) - 注意:
private方法默认带final语义,但更关键的是它不可见、不可继承
避免混淆:子类调用父类方法 ≠ 父类引用指向子类对象
这是两个不同机制:super 是编译期确定的固定调用;而 Parent p = new Child() 是运行时多态,实际执行哪个方法取决于子类是否重写。
比如父类有 void show() { System.out.println("parent"); },子类重写了它,那么 p.show() 输出 “child”,但子类内部 super.show() 一定输出 “parent”。
class Parent {
void show() { System.out.println("parent"); }
}
class Child extends Parent {
void show() {
super.show(); // 明确调用父类版本
System.out.println("child");
}
}
容易忽略的一点是:super 不是“向上查找最近可访问的父类实现”,而是**严格绑定到直接父类声明的方法**。如果父类 A 继承自 B,B 有个方法,A 没重写,那 super 在 A 里能调,在 A 的子类 C 里就不能跨级用 super.super.xxx() —— Java 不支持这种写法。








