4 changed files with 169 additions and 0 deletions
@ -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. 自主完成代码编写、调试、测试,以及实验报告的最终整理。 |
|||
``` |
|||
@ -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; |
|||
} |
|||
} |
|||
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 238 KiB |
Loading…
Reference in new issue