Browse Source

宋瑞-202506050301

main
Songrui 1 week ago
parent
commit
a204011225
  1. 41
      w5/必做/Circle.java
  2. 67
      w5/必做/README.md
  3. 52
      w5/必做/Rectangle.java
  4. 18
      w5/必做/Shape.java
  5. 46
      w5/必做/TestDrawShape.java
  6. 7
      w5/选做/Bike.java
  7. 7
      w5/选做/Car.java
  8. 52
      w5/选做/README.md
  9. 14
      w5/选做/TestVehicle.java
  10. 7
      w5/选做/Truck.java
  11. 4
      w5/选做/Vehicle.java

41
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() {
}
}

67
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. **代码复用**: 通用逻辑集中在父类引用中

52
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;
}
}

18
w5/必做/Shape.java

@ -0,0 +1,18 @@
/**
* 图形抽象类
* 定义所有图形的公共行为计算面积和绘制图形
*/
public abstract class Shape {
/**
* 抽象方法计算图形面积
* @return 图形的面积
*/
public abstract double getArea();
/**
* 抽象方法绘制图形
* 由子类实现具体的绘制逻辑
*/
public abstract void draw();
}

46
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=== 测试完成 ===");
}
}

7
w5/选做/Bike.java

@ -0,0 +1,7 @@
public class Bike extends Vehicle {
@Override
public void run() {
System.out.println("自行车在道路上骑行");
}
}

7
w5/选做/Car.java

@ -0,0 +1,7 @@
public class Car extends Vehicle {
@Override
public void run() {
System.out.println("小汽车在公路上行驶");
}
}

52
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 (类型 变量 : 数组)`
## 预期运行结果

14
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();
}
}
}

7
w5/选做/Truck.java

@ -0,0 +1,7 @@
public class Truck extends Vehicle {
@Override
public void run() {
System.out.println("卡车在高速上运输货物");
}
}

4
w5/选做/Vehicle.java

@ -0,0 +1,4 @@
public abstract class Vehicle {
public abstract void run();
}
Loading…
Cancel
Save