diff --git a/W4/AI 使用情况说明.txt b/W4/AI 使用情况说明.txt new file mode 100644 index 0000000..3b3a702 --- /dev/null +++ b/W4/AI 使用情况说明.txt @@ -0,0 +1,4 @@ +AI 使用情况说明: +1.初期运行时出现方法调用不匹配问题,向 AI 描述现象后,借助其提示排查出是子类未正确@Override父类抽象方法,修正后实现了多态调用的正常运行;在格式化输出环节,参考 AI 提供的printf("%.2f")用法,完成了面积结果保留两位小数的规范展示。 +2.在完成抽象类、继承及多态逻辑的编码后,向 AI 咨询了单文件下多类的命名规范,确认了Main类为唯一公共类、其余类使用缺省访问权限的合法性,以此修正了编译时的类重复问题。 +3.在定义抽象类Shape的getArea()方法时,对abstract关键字的使用场景、子类@Override注解的必要性存在模糊,参考 AI 提示明确了抽象方法无方法体、子类必须重写父类抽象方法的语法要求,修正后实现了抽象类对子类的约束,确保多态调用的基础逻辑正确。 \ No newline at end of file diff --git a/W4/Main.java b/W4/Main.java new file mode 100644 index 0000000..63831c0 --- /dev/null +++ b/W4/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(5); + System.out.print("圆形(半径5):"); + util.printArea(circle); + + // 测试矩形 + Shape rectangle = new Rectangle(4, 6); + System.out.print("矩形(长4,宽6):"); + util.printArea(rectangle); + + // 测试三角形 + Shape triangle = new Triangle(3, 4); + System.out.print("三角形(底3,高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); + } +} \ No newline at end of file diff --git a/W4/反思及组合vs继承.txt b/W4/反思及组合vs继承.txt new file mode 100644 index 0000000..8155b7a --- /dev/null +++ b/W4/反思及组合vs继承.txt @@ -0,0 +1,20 @@ +本次图形面积计算器重构实验,让我对面向对象的核心思想有了更直观的理解,也发现了自身在设计与实践中的不足,现将反思总结如下: +1.抽象思维的重要性:最初我只是想分别写三个图形的计算方法,直到设计抽象类Shape时才意识到,抽象是统一接口的关键。通过抽象方法约束子类行为,才能真正实现 “统一处理不同图形” 的目标,这让我明白抽象不是 “空泛”,而是为了更好的复用与扩展。 +2。多态的实际价值:之前对多态的理解停留在概念层面,这次通过ShapeUtil的printArea方法,我真切体会到多态的便利 —— 不需要判断图形类型,只要传入Shape子类对象就能自动调用对应计算逻辑,代码变得简洁且易于维护,新增图形时几乎不用修改原有代码。 +3.规范意识的欠缺:在单文件多类、抽象方法语法、@Override注解等细节上,我多次因为不熟悉规范而踩坑,比如类重复编译错误、多态调用失效等。这提醒我,严谨的语法规范是代码可运行的基础,今后要更重视基础语法的学习与实践。 +4.文档与可视化的价值:绘制类图时,我才清晰看到类之间的继承与依赖关系,这比单纯看代码更直观。这让我认识到,类图等可视化工具是梳理设计思路、沟通交流的重要手段,今后要养成先画设计图再写代码的习惯。 + + +组合vs继承 +(1)本次实验中使用继承的原因 +代码复用:三个图形都有getArea()方法,通过继承抽象类Shape,避免重复编写抽象方法声明 +统一接口:继承让所有图形拥有统一的getArea()方法,使得ShapeUtil可以通过多态统一处理所有图形,无需为每个图形单独写打印方法 +(2)组合 vs 继承的核心区别 + +维度 继承 (Inheritance) 组合 (Composition) +关系 “is-a” 关系(如:Circle is a Shape) “has-a” 关系(如:ShapeUtil has a Shape) +耦合度 高耦合,子类依赖父类的实现 低耦合,通过接口交互,依赖度低 +适用场景 类之间存在明确的层级关系,且需要复用代码 类之间是整体与部分的关系,需要动态组合功能 +缺点 父类修改可能影响子类,打破封装 代码相对繁琐,需手动组合对象 + +(3)如果后续需要新增更多图形(如正方形、梯形),继承依然适用,因为正方形、梯形都属于 “图形” 的子类,符合 “is-a” 关系。但如果需要给图形新增非核心功能(如:绘制图形的颜色、获取图形的边框),可考虑用组合(如创建ColorUtil工具类组合进Shape),避免继承导致的类臃肿。 \ No newline at end of file diff --git a/W4/图形面积计算器实验报告.pdf b/W4/图形面积计算器实验报告.pdf new file mode 100644 index 0000000..59d4507 Binary files /dev/null and b/W4/图形面积计算器实验报告.pdf differ