super 是 Java 中的一个关键字,它主要在子类中使用,用来指代父类(超类),你可以把它理解为对父类的一个“引用”或“指针”。

super 的核心作用有三个,下面我们逐一说明。
调用父类的构造方法
这是 super 最常见和最重要的用途,子类在创建对象时,会先调用父类的构造方法,以确保父类中定义的属性和行为得到正确的初始化。
语法:
super();// 调用父类的无参构造方法super(参数列表);// 调用父类的有参构造方法
规则:
- 隐式调用:如果在子类的构造方法中没有显式地使用
super()来调用父类的构造方法,Java 编译器会自动在子类构造方法的第一行插入一个super(),这意味着子类默认会调用父类的无参构造方法。 - 必须放在第一行:如果使用了
super(),它必须是子类构造方法中的第一条语句,不能在任何代码(包括this())之前。 - 构造链:通过
super(),可以形成一条从子类到父类,再到祖父类的构造方法调用链,直到Object类(所有类的终极父类)。
示例:
// 父类
class Animal {
private String name;
// 父类的无参构造方法
public Animal() {
System.out.println("Animal 的无参构造方法被调用");
this.name = "未知动物";
}
// 父类的有参构造方法
public Animal(String name) {
System.out.println("Animal 的有参构造方法被调用");
this.name = name;
}
}
// 子类
class Dog extends Animal {
public Dog() {
// 这里隐式调用了 super(),即调用父类的 Animal()
System.out.println("Dog 的无参构造方法被调用");
}
public Dog(String dogName) {
// 显式调用父类的有参构造方法 Animal(String name)
super(dogName);
System.out.println("Dog 的有参构造方法被调用");
}
}
public class Main {
public static void main(String[] args) {
System.out.println("--- 创建 Dog 对象(使用无参构造)---");
Dog dog1 = new Dog();
// 输出:
// Animal 的无参构造方法被调用
// Dog 的无参构造方法被调用
System.out.println("\n--- 创建 Dog 对象(使用有参构造)---");
Dog dog2 = new Dog("旺财");
// 输出:
// Animal 的有参构造方法被调用
// Dog 的有参构造方法被调用
}
}
访问父类的成员变量
当子类的成员变量(字段)与父类的成员变量同名时,如果想在子类中访问父类的那个变量,就需要使用 super。
语法:
super.父类成员变量名;
示例:
class Parent {
int value = 10; // 父类的 value
}
class Child extends Parent {
int value = 20; // 子类的 value,与父类同名
public void printValues() {
System.out.println("子类的 value: " + this.value); // 使用 this 访问子类自己的 value
System.out.println("父类的 value: " + super.value); // 使用 super 访问父类的 value
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.printValues();
}
}
输出:

子类的 value: 20
父类的 value: 10
调用父类的成员方法
当子类重写(Override)了父类的方法后,如果想在子类的方法中调用父类被重写的方法,就需要使用 super。
语法:
super.父类方法名(参数列表);
示例:
class Vehicle {
public void move() {
System.out.println("车辆可以移动");
}
}
class Car extends Vehicle {
@Override // 注解,表示重写父类方法
public void move() {
// 在子类的 move 方法中,先调用父类的 move 方法
super.move();
System.out.println("汽车通过轮子移动");
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.move();
}
}
输出:
车辆可以移动
汽车通过轮子移动
在这个例子中,Car 类重写了 Vehicle 的 move 方法,但在 Car 的 move 方法内部,我们使用 super.move() 来执行父类 Vehicle 的原始 move 方法,然后再添加自己的特有逻辑,这是一种非常常见的扩展父类功能的模式。
super 和 this 的区别
为了更好地理解 super,我们常常会把它和 this 放在一起比较。

| 特性 | this |
super |
|---|---|---|
| 含义 | 指向当前对象的引用。 | 指向父类对象的引用。 |
| 访问成员变量 | this.变量名:访问当前类的成员变量,如果变量名与局部变量同名,用来区分。 |
super.变量名:访问父类的成员变量(即使被子类隐藏)。 |
| 调用成员方法 | this.方法名():调用当前类的成员方法。 |
super.方法名():调用父类的成员方法(通常用于调用被重写的方法)。 |
| 调用构造方法 | this(参数列表):调用当前类的另一个构造方法。 |
super(参数列表):调用父类的构造方法。 |
| 使用位置 | 在当前类的构造方法中,this() 必须是第一行。 |
在子类的构造方法中,super() 必须是第一行。 |
super 是 Java 面向对象编程中实现继承特性的一个关键字,它扮演着连接子类与父类的桥梁角色,它的主要功能可以概括为:
- 构造连接:
super()用于在子类构造方法中调用父类的构造方法,确保父类部分被正确初始化。 - 变量访问:当子类变量与父类变量同名时,
super.变量名用于访问父类的变量。 - 方法调用:当子类重写了父类的方法时,
super.方法名()用于在子类中调用父类的原始版本。
掌握 super 的用法对于理解和运用 Java 的继承机制至关重要。
