You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.0 KiB

车辆管理系统实验报告 实验目的 巩固封装的基本实现:私有属性 + 公有 getter/setter 练习构造方法的重载以及 this 关键字的用法 掌握在业务方法中加入数据校验,保护对象状态的合法性 能够编写测试类验证类的功能 项目结构 CarRentalSystem/ └── src/ └── com/ └── rental/ ├── Car.java # 车辆实体类 └── TestCar.java # 测试类 核心代码说明 Car类设计要点

  1. 属性封装(全部private) private String licensePlate; // 车牌号(不可变) private String brand; // 品牌 private String model; // 型号 private double dailyRent; // 日租金 private boolean isRented; // 租用状态 private static int totalCars; // 车辆总数
  2. 构造方法重载 全参构造方法:接收所有参数,isRented初始化为false 三参构造方法:使用默认日租金300元,通过this()调用全参构造
  3. Getter/Setter规则 licensePlate:只提供getter,不提供setter(不可变) brand、model:提供完整的getter和setter dailyRent:setter中包含数据校验(必须>0) isRented:只提供isRented()查询方法,不提供setter
  4. 业务方法 rentCar():租车,检查当前状态 returnCar():还车,检查当前状态 calculateRent(int days):计算租金 displayInfo():显示车辆信息
  5. 静态成员(加分项) totalCars:统计创建的车辆总数 getTotalCars():返回总车辆数 运行结果 ===== 车辆管理系统测试 =====

=== 创建的车辆信息 === 车牌号:京A12345 品牌:大众 型号:朗逸 日租金:200.0 元/天 租用状态:可租

车牌号:沪B67890 品牌:丰田 型号:凯美瑞 日租金:350.0 元/天 租用状态:可租

车牌号:粤C24680 品牌:本田 型号:雅阁 日租金:300.0 元/天 租用状态:可租

=== 测试租车功能 === 对车辆1进行租车操作: 车辆租用成功 再次尝试租车: 车辆已租出,无法再次租用

=== 测试还车功能 === 对车辆1进行还车操作: 车辆归还成功 再次尝试还车: 车辆未被租用,无需归还

=== 测试租金计算 === 车辆2租用5天的费用:1750.0 元 车辆3租用3天的费用:900.0 元

=== 测试setter数据校验 === 尝试将车辆1的日租金设置为-100: 日租金必须大于0,当前值:-100.0,保持原值:200.0 车辆1当前日租金:200.0 将车辆1的日租金设置为250: 车辆1当前日租金:250.0

=== 测试品牌和型号修改 === 修改后的车辆1信息: 车牌号:京A12345 品牌:奥迪 型号:A4 日租金:250.0 元/天 租用状态:可租

=== 车辆总数统计 === 总车辆数:3 辆

=== 测试完成 === 类图 ┌─────────────────────────────────┐ │ Car │ ├─────────────────────────────────┤ │ - licensePlate: String │ │ - brand: String │ │ - model: String │ │ - dailyRent: double │ │ - isRented: boolean │ │ - totalCars: static int │ ├─────────────────────────────────┤ │ + Car(licensePlate, brand, │ │ model, dailyRent) │ │ + Car(licensePlate, brand, │ │ model) │ │ + getLicensePlate(): String │ │ + getBrand(): String │ │ + setBrand(brand): void │ │ + getModel(): String │ │ + setModel(model): void │ │ + getDailyRent(): double │ │ + setDailyRent(dailyRent): void │ │ + isRented(): boolean │ │ + rentCar(): void │ │ + returnCar(): void │ │ + calculateRent(days): double │ │ + displayInfo(): void │ │ + getTotalCars(): static int │ └─────────────────────────────────┘ 实验总结 封装带来的好处 数据保护:通过private修饰符保护内部数据,防止外部直接修改 数据校验:在setter方法中添加逻辑判断,确保数据的合法性 业务逻辑控制:通过业务方法(rentCar、returnCar)控制状态变化,避免非法操作 易于维护:内部实现改变不影响外部调用 为什么isRented不提供setter? 如果直接提供setRented(boolean)方法,会带来以下风险:

业务逻辑失控:外部可以随意设置租用状态,绕过业务规则 数据不一致:可能导致车辆状态与实际租用情况不符 缺少业务校验:无法检查当前状态是否允许修改 违反封装原则:将内部状态直接暴露给外部 通过提供rentCar()和returnCar()业务方法,可以:

在状态改变前进行业务校验 提供友好的操作提示 确保状态转换的合法性 维护对象的完整性 遇到的问题及解决方法 构造方法重载:使用this()调用其他构造方法,避免代码重复 数据校验:在setter中添加条件判断,保护数据合法性 状态管理:通过业务方法控制状态变化,提供操作反馈 编译和运行 编译 cd C:\Users\王彦舒\Desktop\CarRentalSystem\src javac com/rental/Car.java com/rental/TestCar.java 运行 java com.rental.TestCar 评分要点达成情况 评分要点 分值 完成情况 属性封装正确(全部private) 10分 ✓ 完成 构造方法正确实现(含重载及this调用) 15分 ✓ 完成 Getter/Setter符合要求(含数据校验) 20分 ✓ 完成 业务方法逻辑正确(租车/还车状态切换、提示) 20分 ✓ 完成 测试类全面覆盖各种情况 20分 ✓ 完成 实验报告完整(类图、代码、截图、总结) 15分 ✓ 完成 静态变量和静态方法(加分项) 额外加分 ✓ 完成 总分:100分 + 加分项