5 changed files with 115 additions and 0 deletions
@ -0,0 +1,67 @@ |
|||
// 抽象图形类
|
|||
abstract class Shape { |
|||
public abstract double getArea(); |
|||
} |
|||
|
|||
// 圆形类
|
|||
class Circle extends Shape { |
|||
private double radius; |
|||
|
|||
public Circle(double radius) { |
|||
this.radius = radius; |
|||
} |
|||
|
|||
@Override |
|||
public double getArea() { |
|||
return Math.PI * radius * radius; |
|||
} |
|||
} |
|||
|
|||
// 矩形类
|
|||
class Rectangle extends Shape { |
|||
private double width; |
|||
private double height; |
|||
|
|||
public Rectangle(double width, double height) { |
|||
this.width = width; |
|||
this.height = height; |
|||
} |
|||
|
|||
@Override |
|||
public double getArea() { |
|||
return width * height; |
|||
} |
|||
} |
|||
|
|||
// 三角形类
|
|||
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 0.5 * base * height; |
|||
} |
|||
} |
|||
|
|||
// 工具类
|
|||
class ShapeUtil { |
|||
public void printArea(Shape shape) { |
|||
System.out.printf("面积:%.2f%n", shape.getArea()); |
|||
} |
|||
} |
|||
|
|||
// 主类(程序入口)
|
|||
public class Main { |
|||
public static void main(String[] args) { |
|||
ShapeUtil util = new ShapeUtil(); |
|||
util.printArea(new Circle(5)); |
|||
util.printArea(new Rectangle(4, 6)); |
|||
util.printArea(new Triangle(3, 4)); |
|||
} |
|||
} |
|||
@ -0,0 +1,2 @@ |
|||
反思: |
|||
这次实验做完,我对抽象类、继承和多态的理解比之前深了很多。一开始我觉得没必要写抽象类,直接给每个图形类写个计算面积的方法不就行了,后来发现这样写代码很散乱,要是以后加新图形,很容易忘记加计算方法,而用抽象类统一规范后,所有子类都必须实现 getArea() ,不容易出错,这才明白抽象类的核心作用是“定规矩”。 |
|||
@ -0,0 +1,46 @@ |
|||
一、实验目的 |
|||
|
|||
1. 掌握Java抽象类、继承和多态的核心用法。 |
|||
|
|||
2. 学会用统一的方式处理不同图形的面积计算,简化代码结构。 |
|||
|
|||
3. 能绘制基础的UML类图,理清类之间的继承与依赖关系。 |
|||
|
|||
4. 理解组合与继承的区别,能根据场景选择合适的代码复用方式。 |
|||
|
|||
二、实验内容 |
|||
|
|||
1. 定义抽象类 Shape ,声明抽象方法 getArea() ,规范所有图形的面积计算行为。 |
|||
|
|||
2. 创建 Circle 、 Rectangle 、 Triangle 三个类,继承 Shape 并各自重写 getArea() 方法,实现对应图形的面积计算逻辑。 |
|||
|
|||
3. 编写 ShapeUtil 工具类,通过 printArea() 方法统一打印图形面积,利用多态特性适配不同图形对象。 |
|||
|
|||
4. 编写 Main 类作为程序入口,创建各类图形对象,调用工具类测试功能,确保运行正常。 |
|||
|
|||
5. 用Mermaid工具绘制UML类图,清晰展示类的继承关系和依赖关系。 |
|||
|
|||
三,ai协助记录 |
|||
|
|||
1. 帮我捋清楚这次实验的整体思路,知道该先写抽象类 Shape ,再让图形类去继承它。 |
|||
|
|||
2. 写代码的时候,我哪里不会就问 AI,比如 Circle 、 Rectangle 这些类怎么写,还有 ShapeUtil 工具类的逻辑。 |
|||
|
|||
3. 我跑代码报错,比如找不到 main 方法、类名不一致,都是 AI 帮我分析问题,教我怎么改的。 |
|||
|
|||
4. 画类图的时候,AI 给我讲了类之间的继承箭头怎么画,还帮我调整了类图的结构,让我看得更明白。 |
|||
|
|||
5. 报告里“组合和继承”的区别,我一开始分不清,AI 用大白话给我解释,还帮我整理了对比的内容。 |
|||
四、组合与继承的回答 |
|||
|
|||
1. 继承(Inheritance) |
|||
|
|||
- 定义:是“is-a”的关系,比如圆形是一种图形、矩形是一种图形,子类通过 extends 关键字继承父类的属性和方法,并重写父类的抽象方法来实现专属逻辑。- 本次实验中的作用:用 Shape 作为父类,统一规范所有图形的 getArea() 方法,让不同图形类有统一的行为标准,后续新增图形(比如正方形、梯形)只需继承 Shape 并重写方法即可,不用重新定义规范,代码复用性很强。 |
|||
- 优点:代码结构清晰,能快速建立类的层级关系,统一管理子类的行为规范,适合“本质是同类事物”的场景。 |
|||
|
|||
2. 组合(Composition) - 定义:是“has-a”的关系,通过在一个类中引用另一个类的对象来实现功能复用,比如 ShapeUtil 中使用 Shape 对象,不是继承它,而是调用它的方法。 |
|||
- 本次实验中的体现: ShapeUtil 不继承 Shape ,而是通过 printArea(Shape shape) 方法接收 Shape 类型的参数,间接使用 Shape 子类的功能,这种依赖关系就是组合的一种简单形式。 |
|||
- 优点:降低类之间的耦合度,父类修改不会直接影响调用类,扩展更灵活,适合“一个类需要使用另一个类功能”的场景,而非本质从属关系。 |
|||
五、实验反思 |
|||
|
|||
这次实验做完,我对抽象类、继承和多态的理解比之前深了很多。一开始我觉得没必要写抽象类,直接给每个图形类写个计算面积的方法不就行了,后来发现这样写代码很散乱,要是以后加新图形,很容易忘记加计算方法,而用抽象类统一规范后,所有子类都必须实现 getArea() ,不容易出错,这才明白抽象类的核心作用是“定规矩”。 |
|||
|
After Width: | Height: | Size: 498 KiB |
|
After Width: | Height: | Size: 412 KiB |
Loading…
Reference in new issue