super是当前对象中父类成员的引用,仅在子类非静态上下文中有效;用于显式调用父类构造器(必须首行)、访问被覆盖的方法或隐藏的字段,但不可访问private成员、静态上下文或接口中。

super 不是用来“访问父类”的泛称工具,而是明确指向当前对象中由父类继承而来的成员(字段、方法、构造器)的引用——它只在子类非静态上下文中有效,且不能脱离实例存在。
调用父类构造器必须用 super() 且只能在第一行
子类构造器默认隐式调用 super(),但一旦父类没有无参构造器,就必须显式写 super(...) 并传入匹配参数。否则编译直接报错:java: 无法将类 XXX 中的构造器 XXX 应用于给定类型。
- 必须是构造器的第一条语句,否则编译失败
- 不能和
this()共存于同一个构造器中 - 若父类只有带参构造器,子类所有构造器都得显式调用
super(...)
访问被子类覆盖/隐藏的父类成员用 super.xxx
当子类定义了与父类同名的实例方法或字段时,super 是唯一能绕过动态绑定、强制调用父类版本的方式。注意:静态方法不适用动态绑定,super.staticMethod() 编译通过但实际调用的是父类声明类型对应的方法,和 ParentClass.staticMethod() 等价。
-
super.methodName()强制调用父类实例方法(哪怕被重写) -
super.fieldName访问父类中被子类同名字段隐藏的实例字段(不是重写,是隐藏) - 不能用
super访问父类私有(private)成员,编译不通过
super 不能在静态上下文或顶层类中使用
super 本质是“当前实例的父类视图”,依赖 this 隐式存在。因此在 static 方法、static 块、或非内部类的顶层作用域中使用会触发编译错误:java: 无法从静态上下文中引用非静态 变量 super。
立即学习“Java免费学习笔记(深入)”;
- 匿名内部类里可以用
super,因为它有隐式外部类实例引用 - 接口中不能用
super(接口无继承链上的“父类实例”概念) - lambda 表达式中不可见
super,因为 lambda 没有独立的this或super绑定
最容易忽略的一点:子类字段遮蔽父类字段时,super.field 和 this.field 看似只是“换了个前缀”,实则访问的是两个不同内存位置——JVM 为每个类的字段单独分配空间,super 是唯一能触达父类那一份副本的途径。










