From a94cfee99da3a254fc0e7c95987eb7610021b48e Mon Sep 17 00:00:00 2001 From: Songrui <1778280163@qq.com> Date: Tue, 7 Apr 2026 16:11:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8B=E7=91=9E-202506050301?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w4/src/Circle.java | 38 +++++++++++++++++++++ w4/src/README。md | 77 +++++++++++++++++++++++++++++++++++++++++++ w4/src/Rectangle.java | 48 +++++++++++++++++++++++++++ w4/src/Shape.java | 14 ++++++++ w4/src/ShapeUtil.java | 16 +++++++++ w4/src/TestShape.java | 23 +++++++++++++ w4/src/Triangle.java | 48 +++++++++++++++++++++++++++ 7 files changed, 264 insertions(+) create mode 100644 w4/src/Circle.java create mode 100644 w4/src/README。md create mode 100644 w4/src/Rectangle.java create mode 100644 w4/src/Shape.java create mode 100644 w4/src/ShapeUtil.java create mode 100644 w4/src/TestShape.java create mode 100644 w4/src/Triangle.java diff --git a/w4/src/Circle.java b/w4/src/Circle.java new file mode 100644 index 0000000..860704e --- /dev/null +++ b/w4/src/Circle.java @@ -0,0 +1,38 @@ +/** + * 圆形类,继承自抽象图形类Shape + * 实现圆形的面积计算逻辑:面积 = π * 半径² + */ +public class Circle extends Shape { + // 圆形的半径 + private double radius; + + /** + * 构造方法:初始化圆形半径 + * @param radius 半径(需大于0,此处做简单校验) + */ + public Circle(double radius) { + if (radius <= 0) { + throw new IllegalArgumentException("半径必须大于0!"); + } + this.radius = radius; + } + + /** + * 实现抽象方法:计算圆形面积 + * @return 圆形的面积 + */ + @Override + public double getArea() { + // Math.PI 是Java内置的π常量,精度更高 + return Math.PI * radius * radius; + } + + // Getter方法(可选,便于查看/修改半径) + public double getRadius() { + return radius; + } + + public void setRadius(double radius) { + this.radius = radius; + } +} diff --git a/w4/src/README。md b/w4/src/README。md new file mode 100644 index 0000000..81638f1 --- /dev/null +++ b/w4/src/README。md @@ -0,0 +1,77 @@ + +# AI交互记录 - 图形面积计算器项目 + +## 项目概述 +实现一个基于面向对象思想的图形面积计算器,支持圆形、矩形、三角形的面积计算,体现抽象、继承和多态特性。 + +--- + +## 交互过程 + +### 1. 需求分析阶段 +**用户提问:** 需要设计一个图形面积计算系统,要求使用面向对象的抽象和继承特性。 + +**AI建议:** +- 创建抽象基类 `Shape`,定义统一的 `getArea()` 方法 +- 具体图形类(Circle、Rectangle、Triangle)继承 Shape 并实现各自的面积计算逻辑 +- 使用工具类 `ShapeUtil` 统一管理面积打印,体现多态性 + +--- + +### 2. 核心设计决策 + +#### Q1: 为什么使用抽象类而不是接口? +**AI回答:** +- 抽象类可以包含部分通用实现和成员变量 +- 更符合"是一种(is-a)"的关系建模 +- 便于未来扩展共享行为 + +#### Q2: 如何保证输入参数的合法性? +**AI建议:** +在各图形类的构造方法中添加参数校验: +--- + +### 3. 代码实现要点 + +#### Shape.java(抽象基类) +- 定义抽象方法 `getArea()` 和 `draw()` +- 强制子类实现面积计算逻辑 + +#### Circle.java +- 面积公式:π × r² +- 使用 `Math.PI` 提高精度 + +#### Rectangle.java +- 面积公式:长 × 宽 +- 提供 getter/setter 便于访问属性 + +#### Triangle.java +- 面积公式:底 × 高 / 2 +- 构造时校验底和高必须大于0 + +#### ShapeUtil.java +- 静态方法 `printArea(Shape shape)` 接收任意 Shape 子类 +- 利用多态自动调用对应子类的 `getArea()` 方法 + +#### TestShape.java +- 创建三种图形实例,向上转型为 Shape 类型 +- 统一调用工具类方法,验证多态效果 + +--- + +### 4. 关键技术点总结 + +| 概念 | 应用位置 | 说明 | +|------|---------|------| +| **抽象** | Shape类 | 定义规范,不关心具体实现 | +| **继承** | Circle/Rectangle/Triangle | 复用Shape的结构 | +| **多态** | ShapeUtil.printArea() | 同一方法处理不同图形 | +| **封装** | 私有属性+getter/setter | 保护数据安全性 | +| **异常处理** | 构造方法校验 | 防止非法参数 | + +--- + +### 5. 运行结果示例 +===== 圆形面积 ===== 该图形的面积为:78.54 +===== 矩形面积 ===== 该图形的面积为:12.00 +===== 三角形面积 ===== 该图形的面积为:12.00 \ No newline at end of file diff --git a/w4/src/Rectangle.java b/w4/src/Rectangle.java new file mode 100644 index 0000000..1b2bf61 --- /dev/null +++ b/w4/src/Rectangle.java @@ -0,0 +1,48 @@ +/** + * 矩形类,继承自抽象图形类Shape + * 实现矩形的面积计算逻辑:面积 = 长 * 宽 + */ +public class Rectangle extends Shape { + // 矩形的长和宽 + private double length; + private double width; + + /** + * 构造方法:初始化矩形的长和宽 + * @param length 长(需大于0) + * @param width 宽(需大于0) + */ + public Rectangle(double length, double width) { + if (length <= 0 || width <= 0) { + throw new IllegalArgumentException("长和宽必须大于0!"); + } + this.length = length; + this.width = width; + } + + /** + * 实现抽象方法:计算矩形面积 + * @return 矩形的面积 + */ + @Override + public double getArea() { + return length * width; + } + + // Getter/Setter方法(可选) + public double getLength() { + return length; + } + + public void setLength(double length) { + this.length = length; + } + + public double getWidth() { + return width; + } + + public void setWidth(double width) { + this.width = width; + } +} diff --git a/w4/src/Shape.java b/w4/src/Shape.java new file mode 100644 index 0000000..640e49f --- /dev/null +++ b/w4/src/Shape.java @@ -0,0 +1,14 @@ +/** + * 图形抽象类 + * 定义所有图形的公共行为(计算面积),体现面向对象的抽象特性 + */ +public abstract class Shape { + /** + * 抽象方法:计算图形面积 + * 由具体子类(圆形、矩形、三角形)实现各自的面积计算逻辑 + * @return 图形的面积(double类型) + */ + public abstract double getArea(); + + public abstract void draw(); +} \ No newline at end of file diff --git a/w4/src/ShapeUtil.java b/w4/src/ShapeUtil.java new file mode 100644 index 0000000..dcafac8 --- /dev/null +++ b/w4/src/ShapeUtil.java @@ -0,0 +1,16 @@ +/** + * 图形工具类 + * 提供统一的面积打印方法,支持所有继承自Shape的图形子类 + */ +public class ShapeUtil { + /** + * 打印任意图形的面积 + * @param shape 图形对象(可以是Circle/Rectangle/Triangle的实例,体现多态) + */ + public static void printArea(Shape shape) { + // 调用子类重写的getArea()方法,自动适配不同图形 + double area = shape.getArea(); + // 格式化输出,保留2位小数,更易读 + System.out.printf("该图形的面积为:%.2f%n", area); + } +} diff --git a/w4/src/TestShape.java b/w4/src/TestShape.java new file mode 100644 index 0000000..d8fb12b --- /dev/null +++ b/w4/src/TestShape.java @@ -0,0 +1,23 @@ +/** + * 测试类:验证图形面积计算器的功能 + */ +public class TestShape { + public static void main(String[] args) { + // 1. 创建圆形(半径5) + Shape circle = new Circle(5); + // 2. 创建矩形(长4,宽3) + Shape rectangle = new Rectangle(4, 3); + // 3. 创建三角形(底6,高4) + Shape triangle = new Triangle(6, 4); + + // 调用工具类打印面积(统一处理所有图形) + System.out.println("===== 圆形面积 ====="); + ShapeUtil.printArea(circle); + + System.out.println("===== 矩形面积 ====="); + ShapeUtil.printArea(rectangle); + + System.out.println("===== 三角形面积 ====="); + ShapeUtil.printArea(triangle); + } +} diff --git a/w4/src/Triangle.java b/w4/src/Triangle.java new file mode 100644 index 0000000..99ffb57 --- /dev/null +++ b/w4/src/Triangle.java @@ -0,0 +1,48 @@ +/** + * 三角形类,继承自抽象图形类Shape + * 实现三角形的面积计算逻辑:面积 = 底 * 高 / 2 + */ +public class Triangle extends Shape { + // 三角形的底和高 + private double base; + private double height; + + /** + * 构造方法:初始化三角形的底和高 + * @param base 底(需大于0) + * @param height 高(需大于0) + */ + public Triangle(double base, double height) { + if (base <= 0 || height <= 0) { + throw new IllegalArgumentException("底和高必须大于0!"); + } + this.base = base; + this.height = height; + } + + /** + * 实现抽象方法:计算三角形面积 + * @return 三角形的面积 + */ + @Override + public double getArea() { + return (base * height) / 2; + } + + // Getter/Setter方法(可选) + public double getBase() { + return base; + } + + public void setBase(double base) { + this.base = base; + } + + public double getHeight() { + return height; + } + + public void setHeight(double height) { + this.height = height; + } +}