8 changed files with 103 additions and 0 deletions
@ -0,0 +1,15 @@ |
|||
public class Circle extends Shape { |
|||
// 私有属性:半径
|
|||
private double radius; |
|||
|
|||
// 构造方法:创建圆时必须传入半径
|
|||
public Circle(double radius) { |
|||
this.radius = radius; |
|||
} |
|||
|
|||
// 重写父类抽象方法,实现圆的面积计算
|
|||
@Override |
|||
public double getArea() { |
|||
return Math.PI * radius * radius; |
|||
} |
|||
} |
|||
@ -0,0 +1,18 @@ |
|||
public class Main { |
|||
public static void main(String[] args) { |
|||
// 1. 创建不同图形对象(多态:父类引用指向子类对象)
|
|||
Shape circle = new Circle(2); |
|||
Shape rectangle = new Rectangle(3, 4); |
|||
Shape triangle = new Triangle(5, 4); |
|||
|
|||
// 2. 统一打印面积
|
|||
System.out.println("=== 圆的面积 ==="); |
|||
ShapeUtil.printArea(circle); |
|||
|
|||
System.out.println("=== 矩形的面积 ==="); |
|||
ShapeUtil.printArea(rectangle); |
|||
|
|||
System.out.println("=== 三角形的面积 ==="); |
|||
ShapeUtil.printArea(triangle); |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
public class Rectangle extends Shape { |
|||
// 私有属性:长、宽
|
|||
private double length; |
|||
private double width; |
|||
|
|||
// 构造方法
|
|||
public Rectangle(double length, double width) { |
|||
this.length = length; |
|||
this.width = width; |
|||
} |
|||
|
|||
// 重写父类方法
|
|||
@Override |
|||
public double getArea() { |
|||
return length * width; |
|||
} |
|||
} |
|||
@ -0,0 +1,4 @@ |
|||
public abstract class Shape { |
|||
// 抽象方法:所有图形必须实现面积计算
|
|||
public abstract double getArea(); |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
public class ShapeUtil { |
|||
// 统一打印面积的静态方法:支持所有Shape子类
|
|||
public static void printArea(Shape shape) { |
|||
if (shape == null) { |
|||
System.out.println("图形不能为空!"); |
|||
return; |
|||
} |
|||
double area = shape.getArea(); |
|||
System.out.printf("图形面积为:%.2f%n", area); |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
public 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 base * height / 2; |
|||
} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
图形面积计算器重构实验报告 |
|||
一、AI 使用情况记录 |
|||
1. 概念学习:通过 AI 学习抽象类、继承、多态的核心概念,理解 “统一处理不同类型对象” 的设计思想,明确本次实验的核心目标。 |
|||
2. 代码框架生成:借助 AI 生成抽象类 Shape、图形子类、ShapeUtil 工具类的基础代码框架,明确各类型的职责与结构。 |
|||
3. 代码修正与优化:在 AI 指导下修正构造方法参数、@Override注解使用等细节,优化代码可读性与规范性。 |
|||
4. IDE 操作指导:通过 AI 学习 IntelliJ IDEA 中创建项目、编写代码、运行程序及生成 UML 类图的完整操作流程,解决了类图生成、导出等问题。 |
|||
5. 报告撰写辅助:利用 AI 梳理实验报告结构,获取 “组合 vs 继承” 问题的解答思路,确保报告内容完整、逻辑清晰。 |
|||
二、组合vs继承问题回答 |
|||
五、组合 vs 继承问题回答 |
|||
1. 核心概念 |
|||
• 继承(is-a):表示 “子类是一种父类” 的分类关系,通过 extends 关键字实现,子类可以复用父类的属性与方法,并通过重写实现多态。继承会导致类之间强耦合,父类的修改会影响所有子类。 |
|||
• 组合(has-a):表示 “一个类包含另一个类的对象” 的包含关系,通过成员变量实现,将复杂功能拆分为多个独立类,降低耦合度,提高代码灵活性与可维护性。 |
|||
2. 本实验中的选择与原因 |
|||
本实验采用继承方案,原因如下: |
|||
• Circle、Rectangle、Triangle 都是 Shape 的一种(满足 is-a 关系),符合继承的适用场景。 |
|||
• 通过继承抽象类 Shape,可以利用多态特性,让 ShapeUtil统一处理所有图形对象,无需为每个图形编写单独的打印方法,实现了代码复用与统一管理。 |
|||
• 若采用组合方案,无法自然体现 “图形分类” 的层次关系,也难以实现统一调用的多态效果。 |
|||
3. 适用场景总结 |
|||
• 优先使用组合:当类之间是 “包含 / 使用” 关系(has-a),需要灵活复用功能、降低耦合时,优先选择组合。 |
|||
• 使用继承:当类之间是 “分类 / 从属” 关系(is-a),需要复用父类逻辑并实现多态时,才使用继承。 |
|||
• 设计原则:优先使用组合,而非继承,避免继承带来的强耦合问题,只有在明确满足 is-a 关系且需要多态特性时,才考虑使用继承。 |
|||
Loading…
Reference in new issue