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

    }
}
相关推荐
沐知全栈开发3 小时前
CSS Float(浮动)
开发语言
小张-森林人3 小时前
电子病历文书编辑器 Demo
开发语言·c#
cch89183 小时前
Java vs 汇编:高级与低级的终极对决
java·开发语言·汇编
2301_789015623 小时前
C++:异常
开发语言·c++·异常·异常的处理方式
码上实战3 小时前
到底Java 适不适合做 AI 呢?
java·人工智能·后端·python·ai
CVer儿3 小时前
c++接口内部内存分配问题设计
开发语言·c++
如若1233 小时前
ERROR:pdf2zh.converter:‘str‘ object has no attribute ‘choices‘ converter.py:357
java·开发语言·servlet
2301_789015623 小时前
C++:智能指针
c语言·开发语言·汇编·c++·智能指针
沐知全栈开发3 小时前
SOAP 语法详解
开发语言