super关键字用于子类显式调用父类构造方法、被重写方法或被隐藏字段,必须位于构造方法首行,不可在static上下文使用,且不能访问private成员。

super 关键字用于在子类中访问父类的成员(构造方法、方法、字段),核心是“显式指定调用父类版本”,避免与子类同名成员混淆。
调用父类构造方法
必须放在子类构造方法的第一行,用于初始化继承自父类的部分。若父类没有无参构造,子类必须显式调用 super(...) 指定参数。
- 不写
super()时,编译器自动插入无参super()—— 但前提是父类存在无参构造 - 如果父类只有带参构造(如
Parent(String name)),子类构造中必须写super("xxx"),否则编译失败 - 不能同时出现
this(...)和super(...),二者只能选其一且必须为首句
调用父类被重写的方法
当子类重写了父类方法,仍想执行父类原始逻辑时,用 super.methodName()。
- 例如:子类
toString()中先调用super.toString()获取父类字段信息,再拼接子类特有内容 - 注意:不能在
static方法中使用super,因为super依赖实例上下文
访问父类被隐藏的字段
当子类定义了与父类同名的字段(非重写,而是隐藏),可用 super.fieldName 明确访问父类版本。
立即学习“Java免费学习笔记(深入)”;
- 例如父类有
protected int id = 100;,子类也声明int id = 200;,则super.id得到 100,this.id或直接id得到 200 - 这种字段隐藏容易引发歧义,实际开发中应尽量避免同名字段,优先用 getter/setter 控制访问
不能使用的场景
super 不是对象引用,不能赋值给变量,也不能用于静态上下文或构造方法外的静态块中。
-
super不能出现在static方法、static代码块、或任何无实例的环境中 -
super不能单独使用(如System.out.println(super);)—— 它不是对象,没有自己的类型 - 不能通过
super调用父类的private成员,因为 private 对子类不可见


















