super关键字是Java中保障继承正确性的关键机制,用于显式调用父类构造器(必须首行)、被重写的方法(实现增强式覆盖)及被遮蔽的字段(仅限非private),但不可在static上下文或跨级访问中使用。

super关键字在Java中用于明确访问父类的构造器、方法或字段,不是可有可无的语法糖,而是保障对象正确初始化和继承逻辑清晰的关键机制。
在子类构造函数中必须调用父类构造器
每个子类对象创建时,父类部分必须先完成初始化。Java强制要求:子类构造器第一行必须触发父类构造逻辑。
- 若没写super(),编译器自动插入super()(调用父类无参构造)
- 若父类没有无参构造,而子类又没写super(参数),编译直接失败
- super(…)必须是子类构造器的第一条语句,不能放在if里、变量声明后,也不能和this(…)共存
调用被重写的方法:复用父类逻辑
当子类覆盖了父类方法(如toString、equals),想在子类实现中保留父类行为,就用super.方法名()。
- 只能在非静态实例方法中使用
- 常用于“增强式覆盖”:先执行父类逻辑,再添加子类特有处理
- 不加super直接调用该方法,会调到子类自己,可能引发无限递归
访问被同名字段遮蔽的父类变量
子类定义了与父类同名的实例变量时,该变量会遮蔽(hiding)父类字段,而非重写。此时用super.字段名才能拿到父类那份值。
- 字段没有多态性,访问哪个取决于变量声明类型;super是唯一绕过遮蔽的方式
- 仅适用于public/protected/包内可见字段,private字段无法通过super访问
- static字段不推荐用super访问,应直接用父类名.字段名
哪些地方不能用super?
super不是万能钥匙,它受严格限制:
- 不能出现在static方法、静态代码块或静态字段初始化中
- 不能访问父类的private成员——访问控制规则依然生效
- 只认直接父类,不支持super.super.xxx这种跨级调用
- 不能赋值、不能传参、不能判空,它不是一个对象引用,只是编译期指令

















