super关键字用于显式访问父类成员:构造器中必须首行调用super(...),方法中可用super.method()调用被重写实例方法,字段中可用super.field访问被隐藏的非private实例字段,但不能用于static上下文或接口。

在 Java 继承中,super 关键字用于显式访问父类的成员(构造器、方法、字段),尤其在子类与父类存在同名成员时,能明确指定调用父类版本。
调用父类构造器
子类构造器默认会隐式调用 super()(无参构造器),但若父类没有无参构造器,或需传参初始化父类状态,则必须显式使用 super(...),且该语句必须是子类构造器的第一条语句。
- 父类有带参构造器时,子类必须显式调用:
super(name, age); - 不能同时出现
this(...)和super(...);二者只能选其一,且都必须在首行 - 若未写任何
super(...),编译器自动插入super();—— 要求父类存在无参构造器
访问父类被重写的方法
当子类重写了父类方法,仍可通过 super.methodName() 在子类中调用父类原始实现,常用于扩展逻辑(如在子类方法中先执行父类行为,再添加新操作)。
- 例如:
super.toString()可复用父类格式化逻辑,再拼接子类特有字段 - 仅适用于非
private、非static的实例方法;static方法不支持动态绑定,super.staticMethod()实际是静态解析,非真正“重写调用”
访问父类被隐藏的字段
如果子类定义了与父类同名的实例字段(不推荐,易引发混淆),可用 super.fieldName 明确访问父类版本。注意:字段不存在多态,访问哪个版本取决于引用类型声明,而非实际对象类型。
- 更推荐做法是避免字段重名;若需区分,优先通过 getter 方法封装访问
-
super不能访问父类private字段,即使同包或子类也不行 —— 封装性不受继承影响
常见误区提醒
super 不是对象引用,而是特殊语法,用于编译期确定父类成员调用;它不能单独使用(如 super.toString() 合法,但 super 单独写一行会报错)。
-
super()只能在构造器中调用;super.method()和super.field只能在实例方法或构造器中使用,不能在static上下文中出现 - 不能在静态方法里写
super.xxx,因为super依赖于具体实例 - 接口中没有父类概念,
super不能用于接口默认方法调用“父接口”——接口间是多实现关系,不是继承关系
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











