Browse Source

图形面积计算

main
ZhangYuhan 3 weeks ago
parent
commit
06afe97b87
  1. 15
      w5/Circle.java
  2. 18
      w5/Main.java
  3. 17
      w5/Rectangle.java
  4. 4
      w5/Shape.java
  5. 11
      w5/ShapeUtil.java
  6. 17
      w5/Triangle.java
  7. 0
      w5/图形面积计算器类图
  8. 21
      w5/实验报告

15
w5/Circle.java

@ -0,0 +1,15 @@
public class Circle extends Shape {
// 私有属性:半径
private double radius;
// 构造方法:创建圆时必须传入半径
public Circle(double radius) {
this.radius = radius;
}
// 重写父类抽象方法,实现圆的面积计算
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}

18
w5/Main.java

@ -0,0 +1,18 @@
public class Main {
public static void main(String[] args) {
// 1. 创建不同图形对象(多态:父类引用指向子类对象)
Shape circle = new Circle(2);
Shape rectangle = new Rectangle(3, 4);
Shape triangle = new Triangle(5, 4);
// 2. 统一打印面积
System.out.println("=== 圆的面积 ===");
ShapeUtil.printArea(circle);
System.out.println("=== 矩形的面积 ===");
ShapeUtil.printArea(rectangle);
System.out.println("=== 三角形的面积 ===");
ShapeUtil.printArea(triangle);
}
}

17
w5/Rectangle.java

@ -0,0 +1,17 @@
public class Rectangle extends Shape {
// 私有属性:长、宽
private double length;
private double width;
// 构造方法
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
// 重写父类方法
@Override
public double getArea() {
return length * width;
}
}

4
w5/Shape.java

@ -0,0 +1,4 @@
public abstract class Shape {
// 抽象方法:所有图形必须实现面积计算
public abstract double getArea();
}

11
w5/ShapeUtil.java

@ -0,0 +1,11 @@
public class ShapeUtil {
// 统一打印面积的静态方法:支持所有Shape子类
public static void printArea(Shape shape) {
if (shape == null) {
System.out.println("图形不能为空!");
return;
}
double area = shape.getArea();
System.out.printf("图形面积为:%.2f%n", area);
}
}

17
w5/Triangle.java

@ -0,0 +1,17 @@
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;
}
}

0
w5/图形面积计算器类图

21
w5/实验报告

@ -0,0 +1,21 @@
图形面积计算器重构实验报告
一、AI 使用情况记录
1. 概念学习:通过 AI 学习抽象类、继承、多态的核心概念,理解 “统一处理不同类型对象” 的设计思想,明确本次实验的核心目标。
2. 代码框架生成:借助 AI 生成抽象类 Shape、图形子类、ShapeUtil 工具类的基础代码框架,明确各类型的职责与结构。
3. 代码修正与优化:在 AI 指导下修正构造方法参数、@Override注解使用等细节,优化代码可读性与规范性。
4. IDE 操作指导:通过 AI 学习 IntelliJ IDEA 中创建项目、编写代码、运行程序及生成 UML 类图的完整操作流程,解决了类图生成、导出等问题。
5. 报告撰写辅助:利用 AI 梳理实验报告结构,获取 “组合 vs 继承” 问题的解答思路,确保报告内容完整、逻辑清晰。
二、组合vs继承问题回答
五、组合 vs 继承问题回答
1. 核心概念
• 继承(is-a):表示 “子类是一种父类” 的分类关系,通过 extends 关键字实现,子类可以复用父类的属性与方法,并通过重写实现多态。继承会导致类之间强耦合,父类的修改会影响所有子类。
• 组合(has-a):表示 “一个类包含另一个类的对象” 的包含关系,通过成员变量实现,将复杂功能拆分为多个独立类,降低耦合度,提高代码灵活性与可维护性。
2. 本实验中的选择与原因
本实验采用继承方案,原因如下:
• Circle、Rectangle、Triangle 都是 Shape 的一种(满足 is-a 关系),符合继承的适用场景。
• 通过继承抽象类 Shape,可以利用多态特性,让 ShapeUtil统一处理所有图形对象,无需为每个图形编写单独的打印方法,实现了代码复用与统一管理。
• 若采用组合方案,无法自然体现 “图形分类” 的层次关系,也难以实现统一调用的多态效果。
3. 适用场景总结
• 优先使用组合:当类之间是 “包含 / 使用” 关系(has-a),需要灵活复用功能、降低耦合时,优先选择组合。
• 使用继承:当类之间是 “分类 / 从属” 关系(is-a),需要复用父类逻辑并实现多态时,才使用继承。
• 设计原则:优先使用组合,而非继承,避免继承带来的强耦合问题,只有在明确满足 is-a 关系且需要多态特性时,才考虑使用继承。
Loading…
Cancel
Save