案例二:交通工具调度系统(核心:继承 + 多态 + final + 方法重写)

需求:

  1. 定义父类Vehicle(交通工具),包含final方法getLicense()(获取牌照规则,禁止子类重写)、普通方法run()

  2. 子类CarBus继承Vehicle,重写run()方法实现不同运行逻辑;

  3. 定义VehicleDispatcher调度类,使用多态统一调度所有交通工具;

  4. 禁止创建Vehicle父类对象(可结合抽象类优化),final方法保护核心逻辑不被篡改。

打印结果:

特斯拉小汽车在公路行驶,最高时速120km/h

交通工具牌照统一由交通局颁发


宇通公交车在专用车道行驶,承载乘客

交通工具牌照统一由交通局颁发

思路分析:

1. 设计抽象父类 Vehicle

  • 把 Vehicle 定义为 抽象类 ,目的是禁止外界直接创建父类对象,只作为被继承的模板。
  • 在父类中定义 final 方法 getLicense ()
    • final 修饰 → 子类不能重写、不能覆盖,保证牌照规则统一、安全、不被篡改。
    • 方法功能固定:输出 "交通工具牌照统一由交通局颁发"。
  • 把 run () 定义为 抽象方法
    • 因为每种交通工具行驶方式不一样,父类无法统一实现。
    • 强制子类必须重写,保证系统结构规范
复制代码
public class Vehicle {
    //获取牌照规则
   public final void getLicense(){
        System.out.println("交通工具牌照统一由交通局颁发");
    }

    //普通方法
    public void run(){
        System.out.println("交通工具在运行");
    }
}

2. 设计子类 Car(小汽车)

  • 继承自 Vehicle,获得父类所有可继承功能。
  • 必须重写 run () 方法
    • 实现小汽车的行驶逻辑:输出 "特斯拉小汽车在公路行驶,最高时速 120km/h"。
  • 不能重写父类的 getLicense (),因为它是 final。
复制代码
public class Car extends Vehicle {
    String name;

    public Car(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "小汽车在公路行驶,最高时速120km/h");
    }
}

3. 设计子类 Bus(公交车)

  • 同样继承 Vehicle。
  • 重写 run () 方法
    • 实现公交车的行驶逻辑:输出 "宇通公交车在专用车道行驶,承载乘客"。
  • 同样不能修改 getLicense ()。
复制代码
public class Bus extends Vehicle{
    String name;

    public Bus(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "公交车在专用车道行驶,承载乘客");
    }
}

4. 设计调度类 VehicleDispatcher(多态核心)

  • 作用:统一调度所有交通工具,不管是汽车、公交车,都能用同一个方法管理。
  • 设计一个方法,参数类型为 父类 Vehicle
    • 利用多态特性:父类引用可以指向任意子类对象。
    • 方法内部统一调用:
      1. v.run () → 自动执行对应子类的行驶逻辑(多态)。
      2. v.getLicense () → 执行父类固定的牌照规则。
  • 好处:扩展新交通工具(如 Bike、Train)时,调度类完全不用改,符合面向对象扩展原则。
复制代码
public class VehicleDispartcher {
    public void dispatch(Vehicle v){
        v.run();
        v.getLicense();
    }
}

5. 测试类执行流程

  1. 创建调度器对象。
  2. 创建 Car 对象、Bus 对象,用父类 Vehicle 接收(多态写法)。
  3. 调用调度器的方法,分别传入 car 和 bus。
  4. 系统自动根据对象实际类型,执行对应子类的 run (),并统一执行父类的 getLicense ()。
  5. 最终输出题目要求的结果
复制代码
import java.util.ArrayList;

public class VehicleTest {
    public static void main(String[] args) {
        //创建对象
        VehicleDispartcher vehicleDispartcher = new VehicleDispartcher();

       //创建集合
        ArrayList<Vehicle> vehicles = new ArrayList<>();

        vehicles.add(new Car("特斯拉"));
        vehicles.add(new Bus("宇通"));

        //遍历集合
        for (int i = 0; i < vehicles.size(); i++) {
            Vehicle v = vehicles.get(i);
            vehicleDispartcher.dispatch(v);

        if (i != vehicles.size() - 1){
            System.out.println("--------------------------------");
        }
        }

    }
}
相关推荐
D3bugRealm9 分钟前
cryptography:Python 开发者的加密标准库
开发语言·python·其他
Rain50917 分钟前
2.1 Nest.js 项目初始化与模块化架构
开发语言·前端·javascript·后端·架构·数据分析·node.js
小熊美家熊猫系统36 分钟前
电子合同技术实现与合规实践
java·开发语言·分布式
云烟成雨TD36 分钟前
Agent Scope Java 2.x 系列【3】从零构建 ReActAgent
java·人工智能·agent
ytttr87338 分钟前
C# 定时数据库备份工具
开发语言·数据库·c#
一只叫煤球的猫1 小时前
ThreadForge 源码解读二:一个 Task 从 submit 到完成,内部到底发生了什么?
java·后端·面试
skywalk81631 小时前
言知项目后续方向建议
开发语言·学习·编程
阿狸猿1 小时前
论微服务架构及其应用
java·微服务·架构
拉勾科研工作室2 小时前
区块链工程毕业论文题目【249个】
开发语言·javascript
程序员黑豆2 小时前
Java中的字符串【AI全栈开发】
java