Menu
CoddyTech

super 关键字

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 21 课,共 87 课。

super 关键字提供了一种让子类引用父类的方式。当你需要在子类中访问父类的成员或构造函数时,它非常重要。

super 最常见的用途是调用父类的构造函数。这必须是子类构造函数中的第一条语句:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
    
    public String getBrand() {
        return brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // 必须写在第一行
        this.doors = doors;
    }
}

你还可以使用 super 调用父类方法,当子类中有同名方法时,这尤其有用:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // 调用 Animal 类中的版本
        System.out.println("Meow!");
    }
}

你可以把 super 看作 this 的反义词。this 指向当前对象,而 super 指向该对象中属于父类的部分。当你构建类层次结构,并且子类需要扩展父类的行为而不是完全替换它时,这一区别就至关重要。

challenge icon

挑战

简单

我们来构建一个家电系统,演示子类如何使用 super 调用父类构造函数,并扩展父类方法的行为。

你将创建三个文件来组织代码:

  • Appliance.java:创建一个表示任意家用电器的父类。它应包含:
    • 一个用于存储家电 brand(String)的私有字段
    • 一个用于存储 wattage(int)的私有字段
    • 一个接收这两个值并初始化它们的构造函数
    • 一个返回品牌的 getBrand() 方法
    • 一个返回功率的 getWattage() 方法
    • 一个返回 [brand] - [wattage]W 的 getInfo() 方法
  • WashingMachine.java:创建一个继承 Appliance 的子类。洗衣机具备家电的所有属性,还拥有自己的特殊功能:
    • 一个用于存储 capacity(int)的私有字段,表示以 kg 为单位的装载容量
    • 一个接收品牌、功率和容量的构造函数。使用 super(brand, wattage) 初始化父类部分,然后设置容量
    • 一个返回容量的 getCapacity() 方法
    • 一个使用 super.getInfo() 调用父类 getInfo() 方法,并扩展其内容以返回 [parent info], Capacity: [capacity]kg 的 getInfo() 方法
  • Main.java:创建一个 WashingMachine 并显示其完整信息。你将收到三个输入:品牌(String)、功率(int)和容量(int)。打印对洗衣机调用 getInfo() 的结果。

你将收到三个输入:品牌名称、功率和容量。

注意,super 在这里有两个用途:调用父类构造函数来初始化继承的字段,以及调用父类方法,在其行为基础上进行扩展,而不是完全替换它。

亲手试试

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取输入
        String brand = scanner.nextLine();
        int wattage = scanner.nextInt();
        int capacity = scanner.nextInt();
        
        // TODO: 使用输入的值创建一个 WashingMachine 对象
        
        // TODO: 输出洗衣机调用 getInfo() 的结果
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Java 在线编译器