Skip to content
第 20 / 250 章后端⏱ 10 分钟阅读

第 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();
}

规则

  1. 抽象方法必须由子类实现(除非子类也是抽象类)
  2. 抽象方法不能是 private(子类无法重写)
  3. 抽象方法不能是 static
  4. 抽象方法不能是 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(),让 CarMotorcycle 继承实现。

练习 2:进阶题

用模板方法模式实现一个 GameLoader,定义游戏加载流程(加载配置、加载资源、初始化、启动),让 MobaGameFpsGame 继承。


下一章第 21 章:接口

本站基于 VitePress 构建 · 由 Codebook 团队维护