# 图形面积计算器重构 实验报告 ## 一、实验目的 1. 掌握 Java 抽象类与抽象方法的使用。 2. 理解面向对象的继承、多态特性。 3. 实现不同图形类的统一处理,提高代码扩展性。 ## 二、实验任务 1. 设计抽象类 `Shape`,包含抽象方法 `getArea()`。 2. 让 `Circle`、`Rectangle`、`Triangle` 继承 `Shape` 并实现面积计算。 3. 编写工具类 `ShapeUtil`,提供统一打印面积的方法。 4. 绘制 UML 类图。 5. 完成代码测试与实验报告。 ## 三、实验环境 - 开发工具:Eclipse - 编程语言:Java - 版本控制:Git ## 四、项目结构 ``` src/ ├── Shape.java // 抽象类 ├── Circle.java // 圆形类 ├── Rectangle.java // 矩形类 ├── Triangle.java // 三角形类 ├── ShapeUtil.java // 工具类 └── ShapeTest.java // 测试主类 ``` ## 五、核心代码实现 ### 1. 抽象类 Shape ```java public abstract class Shape { // 抽象方法:计算面积,子类必须实现 public abstract double getArea(); } ``` ### 2. 圆形类 Circle ```java public class Circle extends Shape { // 私有属性:半径 private double radius; // 构造方法:初始化半径 public Circle(double radius) { this.radius = radius; } // 重写父类抽象方法:计算圆面积 πr² @Override public double getArea() { return Math.PI * radius * radius; } } ``` ### 3. 矩形类 Rectangle ```java public class Rectangle extends Shape { // 私有属性:宽、高 private double width; private double height; // 构造方法:初始化宽和高 public Rectangle(double width, double height) { this.width = width; this.height = height; } // 重写父类抽象方法:计算矩形面积 宽×高 @Override public double getArea() { return width * height; } } ``` ### 4. 三角形类 Triangle ```java public class Triangle extends Shape { // 私有属性:底、高 private double base; private double height; // 构造方法:初始化底和高 public Triangle(double base, double height) { this.base = base; this.height = height; } // 重写父类抽象方法:计算三角形面积 底×高/2 @Override public double getArea() { return base * height / 2; } } ``` ### 5. 工具类 ShapeUtil ```java public class ShapeUtil { // 统一打印任意图形的面积(多态实现) public static void printArea(Shape shape) { System.out.println("图形面积:" + shape.getArea()); } } ``` ### 6. 测试主类 ShapeTest ```java public class ShapeTest { public static void main(String[] args) { // 1. 创建不同图形对象(向上转型为Shape父类) Shape circle = new Circle(5); Shape rectangle = new Rectangle(4, 6); Shape triangle = new Triangle(3, 4); // 2. 统一调用工具类打印面积(多态自动调用子类方法) System.out.print("圆形:"); ShapeUtil.printArea(circle); System.out.print("矩形:"); ShapeUtil.printArea(rectangle); System.out.print("三角形:"); ShapeUtil.printArea(triangle); } } ``` ## 六、UML 类图 见提交作业 ## 七、运行结果 ``` 圆形:图形面积:78.53981633974483 矩形:图形面积:24.0 三角形:图形面积:6.0 ``` ## 八、实验总结 1. **抽象类的作用**:`Shape` 作为抽象父类,定义了所有图形的统一行为规范,强制子类必须实现 `getArea()` 方法,保证了代码的一致性。 2. **多态的优势**:通过父类引用指向子类对象,`ShapeUtil` 可以统一处理所有图形,无需为每个图形单独写打印方法,大幅提升了代码的扩展性。 3. **面向对象思想**:本次实验完整实践了封装(私有属性+构造方法)、继承(子类继承父类)、多态(方法重写+父类引用)三大面向对象核心特性。 4. **代码扩展性**:后续新增图形(如正方形、梯形),只需继承 `Shape` 并实现 `getArea()`,无需修改 `ShapeUtil` 等已有代码,符合开闭原则。 ## 九、AI 使用情况 1. 使用 AI 辅助理解抽象类、多态的核心概念,梳理代码结构。 2. AI 提供了代码规范优化、类图绘制、实验报告撰写的指导。 3. 自主完成代码编写、调试、测试,以及实验报告的最终整理。 ```