方法重写(@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()。
挑战
简单让我们构建一个通知系统,演示子类如何重写父类方法来实现各自的专属行为。你将看到 @Override 注解如何帮助发现错误,以及每个子类如何自定义继承的方法。
你将创建 3 个文件来组织代码:
Notification.java:创建一个表示通用通知的父类。它应该包含:- 一个用于保存
message(String)的私有字段 - 一个接收消息的构造函数
- 一个返回消息的
getMessage()方法 - 一个用于打印
Sending notification: [message]的send()方法
- 一个用于保存
EmailNotification.java:创建一个继承 Notification 的子类,自定义通过电子邮件发送通知的方式:- 一个用于保存收件人电子邮件地址(String)的私有字段
recipient - 一个同时接收消息和收件人的构造函数,并使用
super(message)初始化父类部分 - 使用
@Override注解重写send()方法,打印Emailing [recipient]: [message]
- 一个用于保存收件人电子邮件地址(String)的私有字段
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() 方法
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器