diff --git a/w5/必做/Circle.java b/w5/必做/Circle.java new file mode 100644 index 0000000..6b69097 --- /dev/null +++ b/w5/必做/Circle.java @@ -0,0 +1,41 @@ +// 圆形类,继承自 Shape +// 实现圆形的面积计算和绘制功能 +public class Circle extends Shape { + // 圆形的半径 + private double radius; + + /** + * 构造方法:初始化圆形 + * @param radius 半径 + */ + public Circle(double radius) { + this.radius = radius; + } + + /** + * 实现抽象方法:计算圆形面积 + * @return 圆形的面积 + */ + @Override + public double getArea() { + // Math.PI 是 Java 内置的π常量,精度更高 + return Math.PI * radius * radius; + } + + /** + * 实现抽象方法:绘制圆形 + */ + @Override + public void draw() { + System.out.println("绘制一个圆形,半径为:" + radius); + } + + // Getter方法(可选,便于查看/修改半径) + public double getRadius() { + return radius; + } + + void main() { + } + +} diff --git a/w5/必做/README.md b/w5/必做/README.md new file mode 100644 index 0000000..1a1ae43 --- /dev/null +++ b/w5/必做/README.md @@ -0,0 +1,67 @@ + +# AI交互记录 + +## 项目概述 +定义一个shape类(draw方法),子类circle,rectangle重写draw.编写一个方法重写drawshape(shape s),调用其draw方法,并在main中测试 + +## 开发步骤 + +### 1. 创建抽象基类 Shape +**需求**: 定义图形的公共行为 +- 抽象方法 `getArea()`: 计算面积 +- 抽象方法 `draw()`: 绘制图形 + +**实现要点**: +- 使用 `abstract` 关键字声明抽象类 +- 两个抽象方法由子类强制实现 + +### 2. 实现 Rectangle 类 +**需求**: 继承Shape,实现矩形功能 +- 私有属性: `length`(长), `width`(宽) +- 构造方法初始化长和宽 +- 实现 `getArea()`: 返回 `length * width` +- 实现 `draw()`: 输出矩形信息 + +**关键代码**: +public class Rectangle extends Shape { @Override public double getArea() { return length * width; } +@Override +public void draw() { +System.out.println("正在绘制一个矩形,长:" + length + ",宽:" + width); +} +} +### 3. 实现 Circle 类 +**需求**: 继承Shape,实现圆形功能 +- 私有属性: `radius`(半径) +- 构造方法初始化半径 +- 实现 `getArea()`: 返回 `Math.PI * radius * radius` +- 实现 `draw()`: 输出圆形信息 + +**注意**: Circle.java初始为空类,需补充完整实现 + +### 4. 创建测试类 TestDrawShape +**需求**: 演示多态性的三种调用方式 + +**测试场景**: +1. **直接调用**: 通过子类对象直接调用draw() +2. **方法传参**: 通过drawShape(Shape s)方法体现多态 +3. **父类引用**: 使用 `Shape shape = new Circle()` 形式 + +**核心方法**: +public class Rectangle extends Shape { @Override public double getArea() { return length * width; } +@Override +public void draw() { +System.out.println("正在绘制一个矩形,长:" + length + ",宽:" + width); +} +} +## 多态性体现 + +### 编译时 vs 运行时 +- **编译时**: 编译器检查Shape类型是否有draw()方法 +- **运行时**: JVM根据实际对象类型调用对应子类的draw() + +### 优势 +1. **扩展性**: 新增图形只需继承Shape,无需修改drawShape方法 +2. **统一接口**: 所有图形通过相同方式调用 +3. **代码复用**: 通用逻辑集中在父类引用中 + + diff --git a/w5/必做/Rectangle.java b/w5/必做/Rectangle.java new file mode 100644 index 0000000..858389a --- /dev/null +++ b/w5/必做/Rectangle.java @@ -0,0 +1,52 @@ +/** + * 矩形类,继承自 Shape + * 实现矩形的面积计算和绘制功能 + */ +public class Rectangle extends Shape { + // 矩形的长和宽 + private double length; + private double width; + + /** + * 构造方法:初始化矩形 + * @param length 长 + * @param width 宽 + */ + public Rectangle(double length, double width) { + this.length = length; + this.width = width; + } + + /** + * 实现父类方法:计算矩形面积 + * @return 面积 + */ + @Override + public double getArea() { + return length * width; + } + + /** + * 实现父类方法:绘制矩形 + */ + @Override + public void draw() { + System.out.println("正在绘制一个矩形,长:" + length + ",宽:" + width); + } + + /** + * 获取长度 + * @return 长度值 + */ + public double getLength() { + return length; + } + + /** + * 获取宽度 + * @return 宽度值 + */ + public double getWidth() { + return width; + } +} diff --git a/w5/必做/Shape.java b/w5/必做/Shape.java new file mode 100644 index 0000000..29e4722 --- /dev/null +++ b/w5/必做/Shape.java @@ -0,0 +1,18 @@ +/** + * 图形抽象类 + * 定义所有图形的公共行为:计算面积和绘制图形 + */ +public abstract class Shape { + + /** + * 抽象方法:计算图形面积 + * @return 图形的面积 + */ + public abstract double getArea(); + + /** + * 抽象方法:绘制图形 + * 由子类实现具体的绘制逻辑 + */ + public abstract void draw(); +} diff --git a/w5/必做/TestDrawShape.java b/w5/必做/TestDrawShape.java new file mode 100644 index 0000000..aae5b57 --- /dev/null +++ b/w5/必做/TestDrawShape.java @@ -0,0 +1,46 @@ +/** + * 测试类:演示多态性 + * 通过 drawShape 方法调用不同子类的 draw() 方法 + */ +public class TestDrawShape { + + /** + * 通用绘制方法:接收任意 Shape 类型的对象 + * 利用多态性,自动调用对应子类的 draw() 方法 + * @param s Shape 类型的参数 + */ + public static void drawShape(Shape s) { + s.draw(); + } + + /** + * 主方法:程序入口 + * @param args 命令行参数 + */ + public static void main(String[] args) { + System.out.println("=== 图形绘制测试 ===\n"); + + // 1. 创建子类对象 + Circle circle = new Circle(5.0); + Rectangle rectangle = new Rectangle(4.0, 6.0); + + // 2. 直接调用 draw() 方法 + System.out.println("--- 直接调用 draw() ---"); + circle.draw(); + rectangle.draw(); + + // 3. 通过 drawShape() 方法调用(体现多态性) + System.out.println("\n--- 通过 drawShape() 方法调用 ---"); + drawShape(circle); + drawShape(rectangle); + + // 4. 使用父类引用指向子类对象(多态性的典型应用) + System.out.println("\n--- 父类引用指向子类对象 ---"); + Shape shape1 = new Circle(3.0); + Shape shape2 = new Rectangle(2.0, 8.0); + drawShape(shape1); + drawShape(shape2); + + System.out.println("\n=== 测试完成 ==="); + } +} diff --git a/w5/选做/Bike.java b/w5/选做/Bike.java new file mode 100644 index 0000000..a3d939e --- /dev/null +++ b/w5/选做/Bike.java @@ -0,0 +1,7 @@ +public class Bike extends Vehicle { + + @Override + public void run() { + System.out.println("自行车在道路上骑行"); + } +} diff --git a/w5/选做/Car.java b/w5/选做/Car.java new file mode 100644 index 0000000..4a4f09b --- /dev/null +++ b/w5/选做/Car.java @@ -0,0 +1,7 @@ +public class Car extends Vehicle { + + @Override + public void run() { + System.out.println("小汽车在公路上行驶"); + } +} diff --git a/w5/选做/README.md b/w5/选做/README.md new file mode 100644 index 0000000..abdf7e9 --- /dev/null +++ b/w5/选做/README.md @@ -0,0 +1,52 @@ +# AI 交互记录 - Vehicle 抽象类与多态实现 + +## 任务描述 +定义一个抽象父类 Vehicle,包含抽象方法 run(),实现 Car、Bike、Truck 三个子类。在主方法中创建 Vehicle 数组,存放不同的车辆,遍历调用 run()。 + +## 交互过程 + +### 第一步:需求分析 +- **用户请求**:创建抽象类和子类的完整示例,需要从新建文件开始的分步指导 +- **关键要求**: + - 抽象父类 Vehicle 包含抽象方法 run() + - 三个子类:Car、Bike、Truck + - 使用多态:Vehicle 数组存放不同车辆对象 + - 遍历调用 run() 方法 + +### 第二步:代码生成指导 + +#### 1. 创建抽象父类 Vehicle.java +public abstract class Vehicle { public abstract void run(); } +**要点**:使用 `abstract` 关键字定义抽象类和抽象方法 + +#### 2. 创建 Car 子类 Car.java +#### 3. 创建 Bike 子类 Bike.java +#### 4. 创建 Truck 子类 Truck.java +#### 5. 创建测试类 TestVehicle.java +## 涉及的核心知识点 + +1. **抽象类(Abstract Class)** + - 使用 `abstract` 关键字 + - 不能直接实例化 + - 可以包含抽象方法(无方法体) + +2. **继承(Inheritance)** + - 使用 `extends` 关键字 + - 子类必须实现父类的所有抽象方法 + - 使用 `@Override` 注解标记重写方法 + +3. **多态(Polymorphism)** + - 父类引用指向子类对象 + - `Vehicle[]` 数组可以存放任何 Vehicle 的子类对象 + - 运行时根据实际对象类型调用对应的方法 + +4. **增强 for 循环** + - 简化数组/集合的遍历 + - 语法:`for (类型 变量 : 数组)` + +## 预期运行结果 + + + + + diff --git a/w5/选做/TestVehicle.java b/w5/选做/TestVehicle.java new file mode 100644 index 0000000..b81481f --- /dev/null +++ b/w5/选做/TestVehicle.java @@ -0,0 +1,14 @@ +public class TestVehicle { + + public static void main(String[] args) { + Vehicle[] vehicles = new Vehicle[3]; + + vehicles[0] = new Car(); + vehicles[1] = new Bike(); + vehicles[2] = new Truck(); + + for (Vehicle vehicle : vehicles) { + vehicle.run(); + } + } +} diff --git a/w5/选做/Truck.java b/w5/选做/Truck.java new file mode 100644 index 0000000..15b9f24 --- /dev/null +++ b/w5/选做/Truck.java @@ -0,0 +1,7 @@ +public class Truck extends Vehicle { + + @Override + public void run() { + System.out.println("卡车在高速上运输货物"); + } +} diff --git a/w5/选做/Vehicle.java b/w5/选做/Vehicle.java new file mode 100644 index 0000000..d2a46d8 --- /dev/null +++ b/w5/选做/Vehicle.java @@ -0,0 +1,4 @@ +public abstract class Vehicle { + + public abstract void run(); +}