面向对象 方法重写 继承 多态 final 相关案例
交通工具调度系统(核心:继承 + 多态 + final + 方法重写)
需求
定义父类
Vehicle(交通工具),包含final方法getLicense()(获取牌照规则,禁止子类重写)、普通方法run();子类
Car、Bus继承Vehicle,重写run()方法实现不同运行逻辑;定义
VehicleDispatcher调度类,使用多态统一调度所有交通工具;禁止创建
Vehicle父类对象(可结合抽象类优化),final方法保护核心逻辑不被篡改。
打印结果:
特斯拉小汽车在公路行驶,最高时速120km/h 交通工具牌照统一由交通局颁发 ------------------------ 宇通公交车在专用车道行驶,承载乘客 交通工具牌照统一由交通局颁发
解题思路(按需求拆解实现步骤)
- 设计父类
Vehicle:为了禁止创建父类对象,将其定义为抽象类;包含final修饰的getLicense()方法(固定牌照规则,禁止子类篡改),同时定义抽象的run()方法(强制子类根据自身特性重写,实现不同运行逻辑)。 - 实现子类
Car和Bus:两个子类均继承抽象父类Vehicle,必须重写父类的抽象run()方法,分别编写小汽车、公交车的专属运行逻辑;直接继承父类的final方法getLicense(),无需也不能重写。 - 设计调度类
VehicleDispatcher:核心是利用多态实现统一调度,定义dispatch()方法,参数类型为父类Vehicle;该方法内部调用vehicle.run()和vehicle.getLicense(),因多态特性,传入不同子类对象时,会自动执行对应子类重写的run()方法,而getLicense()始终执行父类固定逻辑。 - 测试运行:创建调度器对象,通过父类引用指向子类对象的多态写法,创建
Car和Bus的实例,将实例传入调度器的dispatch()方法,实现统一调度并输出指定结果。
知识点(结合需求一一对应)
1. 抽象类(abstract class)
- 作用:满足 “禁止创建
Vehicle父类对象” 的需求,抽象类无法通过new关键字实例化。 - 关键特性:抽象类中可包含抽象方法(
abstract修饰,无方法体)和普通方法 /final方法;包含抽象方法的类,必须被定义为抽象类。 - 本案例应用:
Vehicle为抽象类,run()为抽象方法,强制子类Car、Bus必须重写该方法,保证子类必有专属的运行逻辑,避免父类方法逻辑不适用子类的问题。
2. 继承(extends)
- 作用:让
Car、Bus复用Vehicle中的通用功能(final方法getLicense()),同时实现子类的个性化扩展(重写run())。 - 关键特性:Java 为单继承,子类只能直接继承一个父类;子类会继承父类中所有非私有(
public/protected)的方法和属性。 - 本案例应用:
Car extends Vehicle、Bus extends Vehicle,子类直接使用父类的getLicense()方法,无需重复编写,实现代码复用。
3.final修饰符(方法层面)
- 作用:满足 “保护核心逻辑不被篡改” 的需求,
final修饰的方法禁止子类重写。 - 关键特性:
final方法的逻辑是固定的,子类只能继承使用,无法修改,适合定义通用、不可变的核心规则(如本案例的牌照颁发规则)。 - 本案例应用:
getLicense()被final修饰,Car和Bus无法重写该方法,保证所有交通工具的牌照规则统一。
4. 方法重写(@Override)
- 作用:让子类根据自身特性,修改父类中方法的实现逻辑,实现 “同一方法,不同行为”。
- 重写规则:方法名、参数列表、返回值类型(子类返回值可兼容父类)必须与父类一致;访问权限不能比父类更严格(如父类
public,子类不能是private);抽象方法的子类重写,需去掉abstract并编写方法体。 - 本案例应用:
Car和Bus分别重写Vehicle的抽象run()方法,编写各自的行驶逻辑,@Override注解显式标记重写,提高代码可读性,编译器会校验重写规则是否正确。
5. 多态(核心)
- 定义:指 “父类引用指向子类对象”,实现 “一个接口,多种实现”,是统一调度不同子类的核心。
- 前提条件:存在继承关系、子类重写父类方法、父类引用指向子类对象(如
Vehicle tesla = new Car("特斯拉"))。 - 运行特性:编译时看父类(编译器校验父类是否有该方法),运行时看子类(实际执行子类重写后的方法逻辑)。
- 本案例应用:调度类
VehicleDispatcher的dispatch()方法参数为父类Vehicle,可接收所有Vehicle的子类对象(Car、Bus);调用vehicle.run()时,运行时会根据传入的实际子类对象,执行对应重写的run()方法,而vehicle.getLicense()因是final方法无法重写,始终执行父类逻辑,最终实现统一调度不同交通工具。
识点关联逻辑
本案例的核心是通过抽象类 + 继承 + 方法重写为多态铺路,通过 final 保护核心逻辑,最终通过多态实现统一调度:
- 抽象类
Vehicle定义了通用规范(牌照规则)和抽象要求(运行逻辑),避免父类实例化且强制子类实现个性化逻辑; - 继承让子类复用通用规范,方法重写让子类实现个性化逻辑,
final保证通用规范不被篡改; - 多态让调度类无需区分
Car和Bus,只需针对父类Vehicle编写调度逻辑,降低代码耦合性,提高扩展性(后续新增交通工具子类,只需重写run(),调度类无需修改)。
