Java面向对象程序设计实验报告

实验一：实现一个封装完整的实体类（Car 类）

一、实验目的

1. 巩固 Java 封装特性，掌握私有属性 + 公有 getter/setter 的标准写法。

2. 练习构造方法重载与 this() 关键字的使用。

3. 学会在 setter 和业务方法中加入数据合法性校验，保证对象状态安全。

4. 掌握租车、还车等简单业务逻辑的实现，并编写测试类验证功能。

5. 理解静态成员变量与静态方法的作用，实现车辆对象数量统计。

二、实验环境

- 操作系统：Windows 10/11

- 开发工具：IntelliJ IDEA / Eclipse

- 开发语言：Java

三、类结构设计（类图）

Car 类

属性（全部 private）：

- licensePlate: String （车牌号，不可修改）

- brand: String （品牌）

- model: String （型号）

- dailyRent: double （日租金）

- isRented: boolean （是否已租出）

- totalCars: static int （车辆总数）

构造方法：

- Car(licensePlate, brand, model, dailyRent) ：全参构造

- Car(licensePlate, brand, model) ：重载构造（默认租金 300）

方法：

- getLicensePlate()

- get/setBrand()

- get/setModel()

- get/setDailyRent() （带校验）

- isRented()

- rentCar() ：租车

- returnCar() ：还车

- calculateRent(days): double ：计算租金

- displayInfo() ：打印车辆信息

- static getTotalCars() ：获取车辆总数

四、核心代码

1. Car.java

java

package com.rental;

public class Car {

private final String licensePlate;

private String brand;

private String model;

private double dailyRent;

private boolean isRented;

private static int totalCars = 0;

// 全参构造

public Car(String licensePlate, String brand, String model, double dailyRent) {

this.licensePlate = licensePlate;

this.brand = brand;

this.model = model;

setDailyRent(dailyRent);

this.isRented = false;

totalCars++;

}

// 重载构造，默认租金300

public Car(String licensePlate, String brand, String model) {

this(licensePlate, brand, model, 300.0);

}

public String getLicensePlate() {

return licensePlate;

}

public String getBrand() {

return brand;

}

public void setBrand(String brand) {

this.brand = brand;

}

public String getModel() {

return model;

}

public void setModel(String model) {

this.model = model;

}

public double getDailyRent() {

return dailyRent;

}

// 租金校验

public void setDailyRent(double dailyRent) {

if (dailyRent > 0) {

this.dailyRent = dailyRent;

} else {

System.out.println("日租金必须大于0，设置失败！");

}

}

public boolean isRented() {

return isRented;

}

// 租车

public void rentCar() {

if (isRented) {

System.out.println("车辆已租出，无法再次租用");

} else {

isRented = true;

System.out.println("租车成功！");

}

}

// 还车

public void returnCar() {

if (!isRented) {

System.out.println("车辆未被租用，无需归还");

} else {

isRented = false;

System.out.println("还车成功！");

}

}

// 计算总租金

public double calculateRent(int days) {

return dailyRent * days;

}

// 显示信息

public void displayInfo() {

System.out.println("=====车辆信息=====");

System.out.println("车牌号：" + licensePlate);

System.out.println("品牌：" + brand);

System.out.println("型号：" + model);

System.out.println("日租金：" + dailyRent);

System.out.println("是否租出：" + (isRented ? "是" : "否"));

System.out.println("=================\n");

}

public static int getTotalCars() {

return totalCars;

}

}

2. TestCar.java

java

package com.rental;

public class TestCar {

public static void main(String[] args) {

// 创建3辆不同车辆

Car car1 = new Car("京A12345", "丰田", "Camry", 280);

Car car2 = new Car("沪B67890", "大众", "Passat");

Car car3 = new Car("粤C98765", "宝马", "325i", 500);

car1.displayInfo();

car2.displayInfo();

car3.displayInfo();

// 测试租车还车逻辑

System.out.println("===测试car1租车还车流程===");

car1.rentCar();

car1.rentCar();

car1.returnCar();

car1.returnCar();

System.out.println();

// 计算5天租金

System.out.println("car2 租用5天总租金：" + car2.calculateRent(5));

System.out.println();

// 测试非法租金

System.out.println("===测试设置负租金===");

car3.setDailyRent(-100);

System.out.println("设置后日租金为：" + car3.getDailyRent());

System.out.println();

// 静态统计

System.out.println("系统当前车辆总数：" + Car.getTotalCars());

}

}

五、运行结果

plaintext

=====车辆信息=====

车牌号：京A12345

品牌：丰田

型号：Camry

日租金：280.0

是否租出：否

=================

=====车辆信息=====

车牌号：沪B67890

品牌：大众

型号：Passat

日租金：300.0

是否租出：否

=================

=====车辆信息=====

车牌号：粤C98765

品牌：宝马

型号：325i

日租金：5