案例二:交通工具调度系统(核心:继承 + 多态 + 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("--------------------------------");
        }
        }

    }
}
相关推荐
~木雨1 分钟前
String 底层原理与常量池全解析:byte []+coder、intern 陷阱、substring 内存泄漏,一篇讲透
java·jvm·内存优化·string·字符串常量池
新知图书10 分钟前
12.3 智能体中Skill的约束与自进化实战
java·前端·数据库
en.en..18 分钟前
C语言 static函数与头文件封装规范
java·c语言·前端
海兰21 分钟前
【 Python 量化交易】开篇
开发语言·python·信息可视化·量化交易
步行cgn25 分钟前
Spring Boot 项目打包部署详解
java·spring boot·后端
pnoker1 小时前
拆解 IoT DC3:六层微服务架构
java·物联网·spring cloud·微服务·架构
cfm_29141 小时前
ThreadLocal 内存泄漏
java·jvm
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
l1t1 小时前
DeepSeek总结的DuckDB在 CI 中为 release 和 glibc CLI 构建启用 LTO - #24225
开发语言·数据库·ci/cd·duckdb
whitelbwwww1 小时前
c++运行RKNN
开发语言·c++