11 changed files with 315 additions and 0 deletions
@ -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() { |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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. **代码复用**: 通用逻辑集中在父类引用中 |
||||
|
|
||||
|
|
||||
@ -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; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
/** |
||||
|
* 图形抽象类 |
||||
|
* 定义所有图形的公共行为:计算面积和绘制图形 |
||||
|
*/ |
||||
|
public abstract class Shape { |
||||
|
|
||||
|
/** |
||||
|
* 抽象方法:计算图形面积 |
||||
|
* @return 图形的面积 |
||||
|
*/ |
||||
|
public abstract double getArea(); |
||||
|
|
||||
|
/** |
||||
|
* 抽象方法:绘制图形 |
||||
|
* 由子类实现具体的绘制逻辑 |
||||
|
*/ |
||||
|
public abstract void draw(); |
||||
|
} |
||||
@ -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=== 测试完成 ==="); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
public class Bike extends Vehicle { |
||||
|
|
||||
|
@Override |
||||
|
public void run() { |
||||
|
System.out.println("自行车在道路上骑行"); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
public class Car extends Vehicle { |
||||
|
|
||||
|
@Override |
||||
|
public void run() { |
||||
|
System.out.println("小汽车在公路上行驶"); |
||||
|
} |
||||
|
} |
||||
@ -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 (类型 变量 : 数组)` |
||||
|
|
||||
|
## 预期运行结果 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -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(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
public class Truck extends Vehicle { |
||||
|
|
||||
|
@Override |
||||
|
public void run() { |
||||
|
System.out.println("卡车在高速上运输货物"); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,4 @@ |
|||||
|
public abstract class Vehicle { |
||||
|
|
||||
|
public abstract void run(); |
||||
|
} |
||||
Loading…
Reference in new issue