super关键字用于子类显式调用父类成员:访问被隐藏的protected/public属性需super.字段名;重写方法中用super.方法名()调用父类逻辑;构造器首行用super(参数)调用父类构造器,且受可见性与上下文限制。

super 关键字用于在子类中显式调用父类的成员(属性、方法、构造器),尤其在子类重写了父类方法或隐藏了父类属性时,能明确访问父类版本。
访问父类的属性
当子类定义了与父类同名的字段(属性),子类对象中实际存在两份数据:一份来自父类(继承而来),一份是子类自己声明的。此时直接用 变量名 访问的是子类自己的字段;要访问被隐藏的父类字段,必须用 super.字段名。
注意:父类字段需为 protected 或 public,若为 private 则无法通过 super 直接访问(只能通过父类提供的 public/protected 方法间接访问)。
示例:
class Parent {
protected String name = "Parent";
}
class Child extends Parent {
private String name = "Child"; // 隐藏了父类的 name
void printNames() {
System.out.println(name); // 输出 "Child"
System.out.println(super.name); // 输出 "Parent"
}
}
调用父类的方法
当子类重写了父类的某个实例方法,又需要在子类方法中执行父类原始逻辑时,用 super.方法名(...) 调用。
常见场景包括:在重写 toString()、equals()、hashCode() 或生命周期方法(如 Android 中的 onCreate())时,先调用父类实现再补充子类逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意:不能用 super 调用静态方法(应直接用 父类名.方法名),也不能在 static 上下文中使用 super。
示例:
class Animal {
void speak() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void speak() {
super.speak(); // 先执行父类逻辑
System.out.println("Dog barks"); // 再执行子类逻辑
}
}
调用父类的构造器
子类构造器第一行默认隐式调用 super()(无参父类构造器)。若父类没有无参构造器,或你想显式调用带参的父类构造器,则必须用 super(参数...),且必须是子类构造器的第一条语句。
如果父类只有带参构造器,而子类构造器中没写 super(...),编译会报错。
示例:
class Vehicle {
String brand;
Vehicle(String brand) {
this.brand = brand;
}
}
class Car extends Vehicle {
String model;
Car(String brand, String model) {
super(brand); // 必须显式调用父类带参构造器
this.model = model;
}
}
使用限制和注意事项
super 不是对象引用,不能赋值给变量,也不能作为方法返回值。
- 不能在 static 方法、static 块、static 变量初始化中使用 super
- 不能在顶层类(非内部类)之外使用 super(如接口中不能用)
- super() 和 this() 不能同时出现在一个构造器中
- super 访问的成员必须对子类可见(即不是 private,且包访问权限满足要求)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










