需求:
-
定义父类
Vehicle(交通工具),包含final方法getLicense()(获取牌照规则,禁止子类重写)、普通方法run(); -
子类
Car、Bus继承Vehicle,重写run()方法实现不同运行逻辑; -
定义
VehicleDispatcher调度类,使用多态统一调度所有交通工具; -
禁止创建
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 :
- 利用多态特性:父类引用可以指向任意子类对象。
- 方法内部统一调用:
- v.run () → 自动执行对应子类的行驶逻辑(多态)。
- v.getLicense () → 执行父类固定的牌照规则。
- 好处:扩展新交通工具(如 Bike、Train)时,调度类完全不用改,符合面向对象扩展原则。
public class VehicleDispartcher {
public void dispatch(Vehicle v){
v.run();
v.getLicense();
}
}
5. 测试类执行流程
- 创建调度器对象。
- 创建 Car 对象、Bus 对象,用父类 Vehicle 接收(多态写法)。
- 调用调度器的方法,分别传入 car 和 bus。
- 系统自动根据对象实际类型,执行对应子类的 run (),并统一执行父类的 getLicense ()。
- 最终输出题目要求的结果
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("--------------------------------");
}
}
}
}