基础继承(extends)
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 20 课,共 87 课。
继承是 OOP 的核心支柱之一。它允许一个类获得另一个类的属性和方法,从而促进代码复用,并在类之间建立自然的层级关系。
在 Java 中,你可以使用 extends 关键字创建继承关系。继承的类称为子类(或子类),被继承的类称为超类(或父类)。
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // 调用父类构造方法
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}Dog 类会自动继承 Animal 的 eat() 方法和 getName() 方法。它也可以定义自己的方法,例如 bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // 继承的方法:“Buddy is eating”
myDog.bark(); // 自身的方法:“Buddy says woof!”可以把继承看作一种“是一个”的关系。Dog 是一个 Animal,因此让 Dog 继承 Animal 是合理的。这种关系让你可以构建共享通用功能、同时添加各自独特行为的专用类。
挑战
简单让我们构建一个简单的车辆系统,演示继承的实际效果。你将创建一个保存车辆共有属性的父类,以及一个通过扩展父类来实现专属行为的子类。
你将把代码分成三个文件:
Vehicle.java:创建一个表示任意车辆的父类。它应该包含:- 一个用于保存车辆
brand(String)的私有字段 - 一个接收品牌名称并将其赋给该字段的构造函数。(这里不需要调用
super(),因为 Vehicle 位于继承层级的顶端。) - 一个返回品牌的
getBrand()方法 - 一个输出
[brand] is starting的start()方法
- 一个用于保存车辆
Motorcycle.java:创建一个扩展 Vehicle 的子类。摩托车是一种车辆,所以这种“is-a”关系适合使用继承。你的 Motorcycle 应该:- 使用
extends继承 Vehicle - 包含一个接收品牌并通过
super(brand)将其传给父类的构造函数 - 添加自己的
wheelie()方法,输出[brand] is doing a wheelie!
- 使用
Main.java:创建一个 Motorcycle 对象,并演示继承而来的行为和独有行为,将所有内容整合起来。你会收到一个输入:品牌名称。调用以下方法,输出两行:- 继承而来的
start()方法 - Motorcycle 自己的
wheelie()方法
- 继承而来的
你会收到一个输入:摩托车的品牌名称(String)。
注意,Motorcycle 无需重写 start() 和 getBrand(),就能自动使用它们。这就是继承的强大之处!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: 用 brand 创建一个 Motorcycle 对象
// TODO: 调用继承的 start() 方法
// TODO: 调用 wheelie() 方法
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器