第 20 章:抽象类
学习目标
- 理解抽象类的本质和用途
- 掌握 abstract 关键字
- 学会模板方法模式
一、什么是抽象类?
抽象类是不能被实例化、专门用来被继承的类。
java
public abstract class Animal { // ① 用 abstract 修饰
protected String name;
public Animal(String name) {
this.name = name;
}
// 抽象方法:只有声明,没有实现
public abstract void makeSound(); // ② 子类必须实现
// 普通方法:可以有实现
public void sleep() {
System.out.println(name + " 在睡觉");
}
}
// Animal a = new Animal("通用动物"); // ❌ 编译报错:不能实例化抽象类二、抽象方法
java
public abstract class Shape {
public abstract double area(); // ① 没有方法体
public abstract double perimeter();
}规则:
- 抽象方法必须由子类实现(除非子类也是抽象类)
- 抽象方法不能是
private(子类无法重写) - 抽象方法不能是
static - 抽象方法不能是
final
三、子类实现抽象方法
java
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() { // ① 必须实现
return Math.PI * radius * radius;
}
@Override
public double perimeter() { // ② 必须实现
return 2 * Math.PI * radius;
}
}java
public class Rectangle extends Shape {
private double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
@Override
public double perimeter() {
return 2 * (width + height);
}
}四、模板方法模式
抽象类的经典应用:
java
public abstract class DataProcessor {
// ① 模板方法:定义算法骨架
public final void process() { // final 防止子类修改流程
readData();
parseData();
saveData();
cleanup();
}
protected abstract void readData();
protected abstract void parseData();
protected abstract void saveData();
protected void cleanup() { // ② 钩子方法,可选实现
System.out.println("清理资源");
}
}
public class JsonProcessor extends DataProcessor {
@Override protected void readData() { System.out.println("读取 JSON"); }
@Override protected void parseData() { System.out.println("解析 JSON"); }
@Override protected void saveData() { System.out.println("保存 JSON"); }
}
public class XmlProcessor extends DataProcessor {
@Override protected void readData() { System.out.println("读取 XML"); }
@Override protected void parseData() { System.out.println("解析 XML"); }
@Override protected void saveData() { System.out.println("保存 XML"); }
}五、抽象类 vs 普通类
| 维度 | 抽象类 | 普通类 |
|---|---|---|
| 能否实例化 | ❌ | ✅ |
| 能否有抽象方法 | ✅ | ❌ |
| 继承 | 必须被继承才有意义 | 可以直接使用 |
六、本章小结
| 要点 | 关键 |
|---|---|
| 抽象类 | 用 abstract 修饰,不能实例化 |
| 抽象方法 | 没有方法体,子类必须实现 |
| 模板方法 | 抽象类定义流程,子类实现细节 |
| 应用 | 框架设计、模板方法模式 |
动手练习
练习 1:基础题
定义抽象类 Vehicle,包含抽象方法 start() 和 stop(),让 Car 和 Motorcycle 继承实现。
练习 2:进阶题
用模板方法模式实现一个 GameLoader,定义游戏加载流程(加载配置、加载资源、初始化、启动),让 MobaGame 和 FpsGame 继承。
下一章:第 21 章:接口 →