super调用父类构造方法必须放在子类构造器第一行;可访问被隐藏的父类实例变量和重写的方法;不能用于static上下文,也不是对象引用。

super调用父类构造方法必须放在第一行
子类构造器启动时,必须先完成父类部分的初始化。Java规定:若需显式调用父类构造器,super() 或 super(参数) 必须作为子类构造方法的第一条语句。
- 不写 super() 时,编译器自动插入 super() —— 但前提是父类存在无参构造器
- 如果父类只有带参构造器(比如
public Parent(String name)),子类构造器必须显式写 super("xxx"),否则编译失败 - 不能同时出现 super() 和 this(),二者都要求独占首行,冲突即报错
用 super.变量名访问被隐藏的父类实例变量
当子类定义了与父类同名的非 static 实例变量时,该变量会“隐藏”父类变量(不是重写)。此时直接写变量名访问的是子类自己的副本;要读取父类那份,必须用 super.变量名。
- 例如父类有
protected int id = 100;,子类也有int id = 200;,那么super.id得到 100,this.id或id得到 200 - 静态变量不被“隐藏”,而是“遮蔽”,可用
ParentClass.STATIC_VAR更清晰,super.STATIC_VAR虽合法但不推荐 - 父类 private 变量无法通过 super 访问,这是封装机制决定的
用 super.方法名() 调用被重写的父类方法
子类重写(override)父类方法后,原逻辑并未消失。在重写方法内部,可通过 super.方法名() 显式复用父类实现,常用于扩展而非替代。
- 典型场景:重写
toString()时写return super.toString() + ", status=active"; - 重写
equals(Object o)时,通常先调用super.equals(o)判断基本继承结构是否一致 - 不能在 static 方法中使用 super —— 因为 super 指向当前对象的父类视图,而 static 不属于任何实例
super 不是对象引用,也不能脱离实例上下文使用
super 是编译期关键字,不是运行时对象,它不占用堆内存,也不能赋值、判空或传递。
- 不能写
Object obj = super;或if (super == null)—— 编译直接报错 - 不能在静态代码块、static 方法、static 字段初始化中使用 super
- super() 只出现在构造器里;super.xxx 只能在实例方法或构造器内使用(构造器中只能用 super(),不能用 super.字段)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











