5 changed files with 150 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||
|
在需求分析阶段,我向AI提问“如何通过抽象类统一处理不同图形面积计算”,AI明确了抽象类 Shape 的设计思路,指导我定义抽象方法 getArea() ,并让 Circle 、 Rectangle 、 Triangle 继承该抽象类,为实验奠定了核心框架。 |
||||
|
|
||||
|
代码实现阶段,我通过AI生成了抽象类、三个图形子类及工具类 ShapeUtil 的基础代码,同时解决了“类名与文件名不一致导致编译失败”“参数传递格式错误”等问题,AI还提供了可直接运行的测试代码,提升了编码效率。 |
||||
|
|
||||
|
类图设计与问题回答环节,AI协助绘制了UML类图,并清晰解释了“组合vs继承”的核心区别,帮助我完成了实验报告的理论部分 |
||||
@ -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); |
||||
|
} |
||||
|
} |
||||
@ -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| |
||||
|
+---------------------------+ |
||||
@ -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验证思路,避免过度依赖工具导致编程能力退化。 |
||||
|
After Width: | Height: | Size: 256 KiB |
Loading…
Reference in new issue