super用于子类访问父类成员:①构造方法中必须首行调用super();②通过super.变量名访问被隐藏的父类变量;③通过super.方法名()调用被重写的父类方法;④不能在静态上下文中使用,也不是对象引用。

Super关键字用于在子类中访问父类的成员,包括调用父类构造方法、访问被重写的成员变量或被覆盖的方法。它的核心作用是明确告诉编译器:这里要操作的是父类的版本,而不是当前类的(可能被重写/隐藏的)版本。
调用父类构造方法:必须放在第一行
子类构造方法默认会隐式调用父类无参构造器。如果父类没有无参构造器,或你想显式调用特定父类构造器,就必须使用super(...),且它必须是子类构造方法中的第一条语句。
- 不写super()时,编译器自动插入super()(仅当父类有无参构造器)
- 若父类只有带参构造器,子类构造器必须显式调用super(参数),否则编译失败
- 不能同时出现super(...)和this(...)(二者都必须是首行,冲突)
访问被子类同名变量隐藏的父类成员变量
当子类定义了与父类同名的实例变量(非static),该变量会隐藏(not override)父类变量。此时用super.变量名可明确访问父类版本。
- 注意:这仅适用于变量隐藏,不适用于方法——方法是重写(override),不是隐藏
- 例如父类有protected int value = 10;,子类也有int value = 20;,则super.value取10,this.value或直接value取20
- 静态变量也可用super.静态变量访问,但更推荐用父类名.变量名提升可读性
调用被重写(Override)的父类方法
子类重写了父类方法后,仍可通过super.方法名(...)调用父类原始实现,常用于扩展逻辑(如在子类方法中先执行父类逻辑,再添加额外处理)。
- 典型场景:重写toString()、equals()、生命周期方法等
- 例如:super.toString() + ", extra info"
- 不能在静态方法中使用super调用实例方法(上下文不匹配)
常见误区提醒
super不是对象引用,不能赋值给变量,也不能做super == null判断;它只是编译器指令,用于定位父类成员。另外,super()只能在构造器中用,super.xxx只能在实例方法/构造器中用(不能在static上下文中使用)。










