Menu
CoddyTech

方法重写(@Override)

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

方法重写允许子类为父类中已定义的方法提供自己的实现。通过这种方式,子类可以自定义继承的行为,以满足自身的特定需求。

重写方法时,对于该子类的对象,子类版本会完全替代父类版本。该方法的名称和参数必须与父类方法相同,返回类型也必须与父类方法相同或为其子类型:

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

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

@Override 注解会告诉编译器,你打算重写父类的方法。虽然它是可选的,但强烈建议使用,因为如果你不小心拼错方法名或使用了错误的参数,编译器会捕获错误:

@Override
public void makeSound() { }  // 正确:编译器会验证这一点

public void makesound() { }  // 拼写错误!这会创建新方法,而不是重写原方法

调用被重写的方法时,Java 会执行实际对象类型对应的版本:

Dog dog = new Dog();
dog.makeSound();  // 输出:Woof!

Cat cat = new Cat();
cat.makeSound();  // 输出:Meow!

还记得上一课的内容吗?如果你想在添加新代码的同时保留父类的行为,可以在重写的方法中使用 super.methodName()。

challenge icon

挑战

简单

让我们构建一个通知系统,演示子类如何重写父类方法来实现各自的专属行为。你将看到 @Override 注解如何帮助发现错误,以及每个子类如何自定义继承的方法。

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

  • Notification.java:创建一个表示通用通知的父类。它应该包含:
    • 一个用于保存 message(String)的私有字段
    • 一个接收消息的构造函数
    • 一个返回消息的 getMessage() 方法
    • 一个用于打印 Sending notification: [message] 的 send() 方法
  • EmailNotification.java:创建一个继承 Notification 的子类,自定义通过电子邮件发送通知的方式:
    • 一个用于保存收件人电子邮件地址(String)的私有字段 recipient
    • 一个同时接收消息和收件人的构造函数,并使用 super(message) 初始化父类部分
    • 使用 @Override 注解重写 send() 方法,打印 Emailing [recipient]: [message]
  • Main.java:演示同一个方法名如何根据对象类型产生不同的行为。你将收到两个输入:一条消息和一个电子邮件地址。创建一个普通的 Notification 和一个 EmailNotification,让它们使用同一条消息,然后分别调用它们的 send(),查看不同的输出。

你将收到两个输入:消息(String)和收件人的电子邮件地址(String)。

输出应包含两行:第一行来自父类的 send() 方法,第二行来自 EmailNotification 中重写的方法。这展示了方法重写如何让子类用自己的实现替换继承的行为。

亲手试试

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取输入
        String message = scanner.nextLine();
        String recipient = scanner.nextLine();
        
        // TODO: 用 message 创建一个 Notification 对象
        
        // TODO: 用 message 和 recipient 创建一个 EmailNotification 对象
        
        // TODO: 调用 Notification 对象的 send() 方法
        
        // TODO: 调用 EmailNotification 对象的 send() 方法
    }
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Java 在线编译器