super用于访问被隐藏的父类实例变量或调用被重写的父类方法;子类同名字段时必须用super.变量名访问父类变量;重写方法中需复用父逻辑时必须用super.方法名();构造器中用super()调用父类构造器且须为第一行。

super 在 Java 中不是用来“调用”父类成员变量的,而是用于明确访问被子类隐藏(shadowed)的父类成员变量,或调用被子类重写(overridden)的父类方法。理解这一点是避免常见误区的关键。
什么时候必须用 super 访问父类变量?
当子类定义了与父类同名的实例变量(字段)时,子类对象中实际存在两份独立变量:一份来自父类,一份来自子类。此时直接用变量名访问的是子类自己的那份,要访问父类那份,就必须用 super.变量名。
- 仅适用于实例变量(非 static),且父子类变量名相同
- static 变量不被“隐藏”,而是被“遮蔽(hiding)”,可用 父类名.变量名 或 super.变量名(在非静态上下文中)访问,但推荐用类名更清晰
- 构造器中不能用 super 访问变量(super() 必须是第一行语句,且是调用父类构造器)
什么时候必须用 super 调用父类方法?
当子类重写了父类的实例方法,又需要在重写方法内部执行父类原逻辑时,必须用 super.方法名() 显式调用。
- 典型场景:子类在重写 toString()、equals()、hashCode()、init() 等方法时,先复用父类处理,再追加子类逻辑
- 不能在 static 方法中使用 super(因为 super 指向当前对象的父类视图,而 static 方法不属于对象)
- 构造器中可用 super() 调用父类构造器,但这是特殊语法,和 super.方法() 不同类
super() 构造器调用的规则与意义
子类构造器默认第一行隐含 super()(无参),若父类没有无参构造器,或你想传参调用特定父类构造器,则必须显式写出 super(...),且必须是构造器的第一条语句。
立即学习“Java免费学习笔记(深入)”;
- 确保父类部分的对象状态被正确初始化
- 如果父类只有带参构造器,子类构造器必须显式调用 super(...),否则编译失败
- 不能同时出现 this() 和 super() —— 构造器链只能单向展开一次
容易混淆的几个点
以下情况 不需要也不允许 使用 super:
- 访问父类 public/protected 的成员变量(未被子类同名变量覆盖)→ 直接用 this.变量名 或变量名即可
- 调用父类未被重写的方法 → 直接调用,JVM 自动按继承链向上查找
- 在静态上下文(static 方法、静态块)中使用 super → 编译错误
- 通过 super 访问父类 private 成员 → 编译错误(private 对子类不可见)









