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

    }
}
相关推荐
xxie1237941 分钟前
Python 闭包的调用方法与实践
开发语言·python
aini_lovee4 分钟前
计算 HOG算子的典型 MATLAB 程序
开发语言·matlab
楷哥爱开发4 分钟前
降低网络爬虫成本:基础设施优化指南
服务器·开发语言·php
尚早立志21 分钟前
Spring Boot 源码研读之ConfigurableEnvironment 环境准备
java·spring boot·后端
YuK.W21 分钟前
Leetcode100: 94.二叉树中序遍历、104.二叉树最大深度、226.翻转二叉树
java·算法·leetcode·二叉树
乂爻yiyao29 分钟前
0. openems 部署与体验
java·openems
TanYYF36 分钟前
spring ai入门教程一
java·人工智能·spring
掉鱼的猫41 分钟前
用 ChatModel 构建 LLM 驱动的 Java 应用
java·llm
41541144 分钟前
JTS 空间运算实战:线 × 线、线 × 面、面 × 面叠加分析
java·jts·叠加分析
feifeigo1231 小时前
matlab电力系统重构实现
开发语言·matlab·重构