super是Java中用于在子类中显式访问父类成员的关键字,解决同名成员歧义问题,并可在构造方法中调用父类初始化逻辑;支持访问非private字段和被重写方法,且必须在构造方法首行显式调用父类构造器。

super 是 Java 中用于在子类中显式访问父类成员的关键字,主要解决子类与父类成员同名时的歧义问题,也能在构造方法中调用父类初始化逻辑。
访问父类的属性和方法
当子类定义了与父类同名的字段或方法(尤其是被重写的方法),直接使用变量名或方法名会访问子类自身的成员。此时用 super.成员名 可明确调用父类版本:
- super.fieldName —— 访问父类中非 private 的字段(注意:private 字段不可直接访问)
- super.methodName(...) —— 调用父类中被重写的方法,即使子类有同名方法也会执行父类逻辑
例如:
// 父类
class Animal {
protected String name = "Animal";
public void speak() { System.out.println("Some sound"); }
}
// 子类
class Dog extends Animal {
private String name = "Dog"; // 隐藏父类 name
@Override public void speak() { System.out.println("Woof!"); }
public void show() {
System.out.println(super.name); // 输出 "Animal"
super.speak(); // 输出 "Some sound"
}
}
在构造方法中调用父类构造器
子类构造方法默认第一行隐含 super()(无参调用)。若父类没有无参构造器,或需传参初始化父类状态,则必须显式使用 super(...),且必须是子类构造方法的第一条语句:
- super() —— 调用父类无参构造器
- super(arg1, arg2) —— 调用父类对应参数列表的构造器
- 不能与 this(...) 同时出现;二者都必须是构造方法首行
例如:
class Person {
String name;
Person(String name) { this.name = name; }
}
class Student extends Person {
int id;
Student(String name, int id) {
super(name); // 必须写,否则编译失败
this.id = id;
}
}
注意事项和限制
- super 只能在子类的非静态上下文中使用(实例方法、构造方法),不能在 static 方法或静态代码块中使用
- 不能通过 super 访问父类的 private 成员(编译错误),但可通过父类提供的 public/protected 方法间接访问
- super 不是一个对象引用,不能赋值给变量,也不能作为方法返回值
- 在重写方法中不加 super 直接调用同名方法,调用的是当前对象的运行时类型方法(即子类自己的),不是父类的


















