super::实例方法名是方法引用,不能直接调用父类方法,必须配合函数式接口使用,且仅在子类中有效;它指向父类可访问的实例方法,绕过子类重写,但不适用于静态方法或构造器。

在 Java 中,super::实例方法名 是一种方法引用(Method Reference)写法,但它**不能直接调用父类方法**,也不能单独执行。它只是对“通过 super 调用父类某个实例方法”这一行为的**引用描述**,必须配合函数式接口(如 Consumer、Function、Supplier 等)使用,且仅在子类中有效。
super::方法名 的本质是方法引用,不是立即调用
它和 this::method、String::length 类似,表示“将来可能被调用”的方法,本身不触发执行。真正调用发生在函数式接口的抽象方法被实现并执行时(比如 accept()、apply())。
-
super::toString不会立刻打印内容,只是告诉编译器:“这个引用指向父类的toString()方法” - 只有把它赋给兼容的函数式接口变量,或传给接受该接口的方法(如
Stream.forEach()),才会实际调用
必须在子类中使用,且父类方法需可访问
该语法只能写在继承了父类的子类内部,且父类中的目标方法不能是 private(否则编译报错),通常为 public 或 protected。
- 若父类方法是
private,即使子类能继承字段,也无法通过super::引用其方法 - 若父类方法被子类重写,
super::method明确指向父类版本,绕过重写逻辑
典型使用场景:传递父类方法作为函数式参数
常见于需要将父类行为作为回调或处理器的场合,比如集合操作、自定义比较器、事件处理等。
- 替代匿名内部类或 Lambda 表达式,使代码更简洁
- 例如:子类重写了
toString(),但想在某个地方仍用父类原始实现:
class Parent { public String toString() { return "Parent"; } }
class Child extends Parent {
public String toString() { return "Child"; }
void demo() {
// 获取父类 toString 的引用,并立即执行
Supplier<string> parentToString = super::toString;
System.out.println(parentToString.get()); // 输出 "Parent"
}
}
</string>
不能用于静态方法或构造器
super:: 只适用于实例方法。父类的静态方法要用 ParentClass::staticMethod;构造器用 ParentClass::new,但都不能加 super:: 前缀。
-
super::staticMethod❌ 编译错误 -
super::new❌ 不合法(构造器引用不支持super限定)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











