diff --git a/w5/Main.java b/w5/Main.java new file mode 100644 index 0000000..1d52caf --- /dev/null +++ b/w5/Main.java @@ -0,0 +1,67 @@ +// 抽象图形类 +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 width; + private double height; + + public Rectangle(double width, double height) { + this.width = width; + this.height = height; + } + + @Override + public double getArea() { + return width * height; + } +} + +// 三角形类 +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 0.5 * base * height; + } +} + +// 工具类 +class ShapeUtil { + public void printArea(Shape shape) { + System.out.printf("面积:%.2f%n", shape.getArea()); + } +} + +// 主类(程序入口) +public class Main { + public static void main(String[] args) { + ShapeUtil util = new ShapeUtil(); + util.printArea(new Circle(5)); + util.printArea(new Rectangle(4, 6)); + util.printArea(new Triangle(3, 4)); + } +} \ No newline at end of file diff --git a/w5/反思.txt b/w5/反思.txt new file mode 100644 index 0000000..b2ccc20 --- /dev/null +++ b/w5/反思.txt @@ -0,0 +1,2 @@ +反思: +这次实验做完,我对抽象类、继承和多态的理解比之前深了很多。一开始我觉得没必要写抽象类,直接给每个图形类写个计算面积的方法不就行了,后来发现这样写代码很散乱,要是以后加新图形,很容易忘记加计算方法,而用抽象类统一规范后,所有子类都必须实现 getArea() ,不容易出错,这才明白抽象类的核心作用是“定规矩”。 \ No newline at end of file diff --git a/w5/实验报告.txt b/w5/实验报告.txt new file mode 100644 index 0000000..4e3b024 --- /dev/null +++ b/w5/实验报告.txt @@ -0,0 +1,46 @@ +一、实验目的 + +1. 掌握Java抽象类、继承和多态的核心用法。 + +2. 学会用统一的方式处理不同图形的面积计算,简化代码结构。 + +3. 能绘制基础的UML类图,理清类之间的继承与依赖关系。 + +4. 理解组合与继承的区别,能根据场景选择合适的代码复用方式。 + +二、实验内容 + +1. 定义抽象类 Shape ,声明抽象方法 getArea() ,规范所有图形的面积计算行为。 + +2. 创建 Circle 、 Rectangle 、 Triangle 三个类,继承 Shape 并各自重写 getArea() 方法,实现对应图形的面积计算逻辑。 + +3. 编写 ShapeUtil 工具类,通过 printArea() 方法统一打印图形面积,利用多态特性适配不同图形对象。 + +4. 编写 Main 类作为程序入口,创建各类图形对象,调用工具类测试功能,确保运行正常。 + +5. 用Mermaid工具绘制UML类图,清晰展示类的继承关系和依赖关系。 + +三,ai协助记录 + +1. 帮我捋清楚这次实验的整体思路,知道该先写抽象类  Shape ,再让图形类去继承它。 + +2. 写代码的时候,我哪里不会就问 AI,比如  Circle 、 Rectangle  这些类怎么写,还有  ShapeUtil  工具类的逻辑。 + +3. 我跑代码报错,比如找不到  main  方法、类名不一致,都是 AI 帮我分析问题,教我怎么改的。 + +4. 画类图的时候,AI 给我讲了类之间的继承箭头怎么画,还帮我调整了类图的结构,让我看得更明白。 + +5. 报告里“组合和继承”的区别,我一开始分不清,AI 用大白话给我解释,还帮我整理了对比的内容。 +四、组合与继承的回答 + +1. 继承(Inheritance) + +- 定义:是“is-a”的关系,比如圆形是一种图形、矩形是一种图形,子类通过 extends 关键字继承父类的属性和方法,并重写父类的抽象方法来实现专属逻辑。- 本次实验中的作用:用 Shape 作为父类,统一规范所有图形的 getArea() 方法,让不同图形类有统一的行为标准,后续新增图形(比如正方形、梯形)只需继承 Shape 并重写方法即可,不用重新定义规范,代码复用性很强。 +- 优点:代码结构清晰,能快速建立类的层级关系,统一管理子类的行为规范,适合“本质是同类事物”的场景。 + +2. 组合(Composition) - 定义:是“has-a”的关系,通过在一个类中引用另一个类的对象来实现功能复用,比如 ShapeUtil 中使用 Shape 对象,不是继承它,而是调用它的方法。 +- 本次实验中的体现: ShapeUtil 不继承 Shape ,而是通过 printArea(Shape shape) 方法接收 Shape 类型的参数,间接使用 Shape 子类的功能,这种依赖关系就是组合的一种简单形式。 +- 优点:降低类之间的耦合度,父类修改不会直接影响调用类,扩展更灵活,适合“一个类需要使用另一个类功能”的场景,而非本质从属关系。 +五、实验反思 + +这次实验做完,我对抽象类、继承和多态的理解比之前深了很多。一开始我觉得没必要写抽象类,直接给每个图形类写个计算面积的方法不就行了,后来发现这样写代码很散乱,要是以后加新图形,很容易忘记加计算方法,而用抽象类统一规范后,所有子类都必须实现 getArea() ,不容易出错,这才明白抽象类的核心作用是“定规矩”。 \ No newline at end of file diff --git a/w5/类图.png b/w5/类图.png new file mode 100644 index 0000000..702520d Binary files /dev/null and b/w5/类图.png differ diff --git a/w5/运行成功截图.png b/w5/运行成功截图.png new file mode 100644 index 0000000..5a4c083 Binary files /dev/null and b/w5/运行成功截图.png differ