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

需求:

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

  2. 子类Car、Bus继承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("--------------------------------");
        }
        }

    }
}
相关推荐
Xiu Yan15 分钟前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖24 分钟前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理25 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
木头科技31 分钟前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
深盾科技_Virbox34 分钟前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
thefool11226634 分钟前
多线程 3
java
CoderYanger41 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
liangbo71 小时前
01-Java 集合框架全景:从 Collection 到 Map 一张关系网理清
java
xuxigifxfh1 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo71 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具