diff --git a/w4/README.md b/w4/README.md new file mode 100644 index 0000000..f8fa36e --- /dev/null +++ b/w4/README.md @@ -0,0 +1,155 @@ + +# 图形面积计算器重构 实验报告 + +## 一、实验目的 +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. 自主完成代码编写、调试、测试,以及实验报告的最终整理。 +``` \ No newline at end of file diff --git a/w4/Triangle.java b/w4/Triangle.java new file mode 100644 index 0000000..4b0b730 --- /dev/null +++ b/w4/Triangle.java @@ -0,0 +1,14 @@ +public class Triangle extends Shape { + private double base; + private double height; + + public Triangle(double base, double height) { + this.base = base; + this.height = height; + } + + @Override + public double getArea() { + return base * height / 2; + } +} \ No newline at end of file diff --git a/w4/代码运行结果.png b/w4/代码运行结果.png new file mode 100644 index 0000000..2b5dfd8 Binary files /dev/null and b/w4/代码运行结果.png differ diff --git a/w4/类图.jpg b/w4/类图.jpg new file mode 100644 index 0000000..73c6d47 Binary files /dev/null and b/w4/类图.jpg differ