Browse Source

面积

master
zhaoyinghui 3 weeks ago
parent
commit
6bf7fdc26a
  1. 5
      W4/shape/AI使用记录.txt
  2. 80
      W4/shape/Main.java
  3. 21
      W4/shape/类图.txt
  4. 44
      W4/shape/继承vs组合.txt
  5. BIN
      W4/shape/运行截图.png

5
W4/shape/AI使用记录.txt

@ -0,0 +1,5 @@
在需求分析阶段,我向AI提问“如何通过抽象类统一处理不同图形面积计算”,AI明确了抽象类 Shape 的设计思路,指导我定义抽象方法 getArea() ,并让 Circle 、 Rectangle 、 Triangle 继承该抽象类,为实验奠定了核心框架。
代码实现阶段,我通过AI生成了抽象类、三个图形子类及工具类 ShapeUtil 的基础代码,同时解决了“类名与文件名不一致导致编译失败”“参数传递格式错误”等问题,AI还提供了可直接运行的测试代码,提升了编码效率。
类图设计与问题回答环节,AI协助绘制了UML类图,并清晰解释了“组合vs继承”的核心区别,帮助我完成了实验报告的理论部分

80
W4/shape/Main.java

@ -0,0 +1,80 @@
// Main.java
public class Main {
public static void main(String[] args) {
ShapeUtil util = new ShapeUtil();
// 测试圆形
Shape circle = new Circle(2);
System.out.print("圆形(半径2):");
util.printArea(circle);
// 测试矩形
Shape rectangle = new Rectangle(7, 6);
System.out.print("矩形(长7,宽6):");
util.printArea(rectangle);
// 测试三角形
Shape triangle = new Triangle(5, 4);
System.out.print("三角形(底5,高4):");
util.printArea(triangle);
}
}
// 抽象类 Shape(不加 public)
abstract class Shape {
public abstract double getArea();
}
// 圆形类
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
// 矩形类
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;
}
}
// 三角形类
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;
}
}
// 工具类
class ShapeUtil {
public void printArea(Shape shape) {
double area = shape.getArea();
System.out.printf("该图形的面积为:%.2f%n", area);
}
}

21
W4/shape/类图.txt

@ -0,0 +1,21 @@
+---------------------------+
| Shape | <-- 抽象类
+---------------------------+
| |
| + getArea(): double | <-- 抽象方法
+---------------------------+
| 继承
+----------+----------+-----------+
| Circle | Rectangle | Triangle |
+-----------+----------+-----------+
| - radius: double | - width: double | - base: double |
| + Circle(r: double) | + Rectangle(w: double, h: double) | + Triangle(b: double, h: double) |
| + getArea(): double | + getArea(): double | + getArea(): double |
+-----------+----------+-----------+
+---------------------------+
| ShapeUtil | <-- 工具类
+---------------------------+
| + printArea(s: Shape): void|
+---------------------------+

44
W4/shape/继承vs组合.txt

@ -0,0 +1,44 @@
1. 继承(is-a 关系)
- 优点:代码复用、多态统一处理(如  Shape  统一调用  getArea() ),符合“是一种”语义(圆是一种图形)。
- 缺点:耦合度高,子类必须实现父类所有抽象方法;Java 单继承限制,无法复用多个类的功能;修改父类会影响所有子类;
继承关系在编译时确定,运行时无法改变。
2. 组合(has-a 关系)
- 优点:低耦合、高复用,可灵活组合多个功能;不破坏封装,可动态替换组件;一个类包含另一个类的对象作为成员。
- 缺点:需要手动委托方法,代码量稍多,没有继承的多态便捷性;无法自动继承功能。
3.本项目使用继承的原因:
均是继承关系
圆 是一种 图形
Circle extends Shape
矩形 是一种 图形
Rectangle extends Shape
三角形 是一种 图形
Triangle extends Shape
需要多态:
ShapeUtil.printArea(Shape shape) 需要统一处理
用 Shape 类型可以接受任何图形
代码复用:
所有图形都有 name 属性
继承避免重复代码
反思:
1. 对Java语法与命名规范的理解不足
最初修改类名、文件名后代码无法运行,暴露了我对“ public 类必须与文件名完全一致”“构造方法参数不能带标签名”等基础规则掌握不牢。今后要先夯实语法基础,再进行代码重构,避免因细节疏忽导致编译错误。
2. 面向对象设计思维仍需强化
一开始依赖AI给出抽象类框架,自己对“为何用抽象类实现多态”的理解不够深入。通过本次实验才真正体会到:抽象类 Shape 的价值在于统一接口,让 ShapeUtil 能无差别处理所有图形,这是多态思想的核心体现。
3. 工具依赖与自主思考的平衡待优化
实验中多次依赖AI排查错误、生成代码,虽然提升了效率,但也削弱了自主分析问题的能力。今后要先尝试独立解决问题,再借助AI验证思路,避免过度依赖工具导致编程能力退化。

BIN
W4/shape/运行截图.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Loading…
Cancel
Save