Java实现形状继承与多态,计算周长和面积
以下是实现上述需求的 Java 代码: ```java import java.util.Arrays; import java.util.Scanner; // 定义抽象类 Shape abstract class Shape { // 不可变静态常量 PI public static final double PI = 3.14; // 抽象方法:计算周长 public abstract double getPerimeter(); // 抽象方法:计算面积 public abstract double getArea(); } // Rectangle 类继承自 Shape 类 class Rectangle extends Shape { private int width; private int length; // 带参构造方法 public Rectangle(int width, int length) { this.width = width; this.length = length; } // 重写 getPerimeter 方法 @Override public double getPerimeter() { return 2 * (width + length); } // 重写 getArea 方法 @Override public double getArea() { return width * length; } // 重写 toString 方法 @Override public String toString() { return "Rectangle [width=" + width + ", length=" + length + "]"; } } // Circle 类继承自 Shape 类 class Circle extends Shape { private int radius; // 带参构造方法 public Circle(int radius) { this.radius = radius; } // 重写 getPerimeter 方法 @Override public double getPerimeter() { return 2 * PI * radius; } // 重写 getArea 方法 @Override public double getArea() { return PI * radius * radius; } // 重写 toString 方法 @Override public String toString() { return "Circle [radius=" + radius + "]"; } } public class Main { // 计算所有形状的面积之和 public static double sumAllArea(Shape[] shapes) { double sum = 0; for (Shape shape : shapes) { sum += shape.getArea(); } return sum; } // 计算所有形状的周长之和 public static double sumAllPerimeter(Shape[] shapes) { double sum = 0; for (Shape shape : shapes) { sum += shape.getPerimeter(); } return sum; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); // 消耗掉 nextInt 后的换行符 Shape[] shapes = new Shape[n]; for (int i = 0; i < n; i++) { String type = scanner.nextLine(); if ("rect".equals(type)) { String[] values = scanner.nextLine().split(" "); int width = Integer.parseInt(values[0]); int length = Integer.parseInt(values[1]); shapes[i] = new Rectangle(width, length); } else if ("cir".equals(type)) { int radius = scanner.nextInt(); scanner.nextLine(); // 消耗掉 nextInt 后的换行符 shapes[i] = new Circle(radius); } } // 计算并输出周长之和 System.out.println(sumAllPerimeter(shapes)); // 计算并输出面积之和 System.out.println(sumAllArea(shapes)); // 输出所有形状信息 System.out.println(Arrays.toString(shapes)); // 输出每个形状的类型与父类型 for (Shape shape : shapes) { System.out.println(shape.getClass() + "," + shape.getClass().getSuperclass()); } scanner.close(); } } ``` ### 代码解释 1. **抽象类 `Shape`**: - 定义了不可变静态常量 `PI`,值为 3.14。 - 包含两个抽象方法 `getPerimeter()` 和 `getArea()`,用于计算形状的周长和面积。 2. **`Rectangle` 类**: - 继承自 `Shape` 类,有 `width` 和 `length` 两个属性。 - 实现了 `getPerimeter()` 和 `getArea()` 方法,分别计算矩形的周长和面积。 - 重写了 `toString()` 方法,方便输出矩形信息。 3. **`Circle` 类**: - 继承自 `Shape` 类,有 `radius` 属性。 - 实现了 `getPerimeter()` 和 `getArea()` 方法,分别计算圆的周长和面积。 - 重写了 `toString()` 方法,方便输出圆的信息。 4. **`sumAllArea` 和 `sumAllPerimeter` 方法**: - 这两个方法都是静态方法,用于计算形状数组中所有形状的面积和周长之和。 5. **`main` 方法**: - 读取用户输入的形状数量 `n`。 - 根据输入的形状类型(`rect` 或 `cir`)创建相应的形状对象,并存储在 `shapes` 数组中。 - 调用 `sumAllPerimeter` 和 `sumAllArea` 方法计算并输出周长和面积之和。 - 输出所有形状的信息。 - 输出每个形状的类型和父类型。 ### 进阶使用指南 - **性能优化**:当前代码的时间复杂度为 $O(n)$,已经比较高效。如果需要处理大量形状,可以考虑并行计算以提高性能。 - **错误处理**:在读取用户输入时,可以添加输入验证,确保输入的合法性,避免程序崩溃。 - **扩展功能**:可以添加更多的形状类,如三角形、梯形等,只需继承 `Shape` 类并实现相应的方法即可。 - **安全建议**:在处理用户输入时,要注意防止输入恶意数据,避免出现安全漏洞。 - **常见陷阱规避**:在混合使用 `nextInt` 和 `nextLine` 时,要注意处理行尾的换行符,避免出现输入错误。 ### 开发建议 - **合理设计类结构**:通过继承和多态,可以提高代码的可维护性和扩展性。 - **注重代码可读性**:使用有意义的变量名和方法名,添加必要的注释,提高代码的可读性。 - **单元测试**:编写单元测试来验证 `sumAllArea` 和 `sumAllPerimeter` 方法的正确性,确保代码的质量。 ### 相关技术栈推荐 - **Java 官方文档**:https://docs.oracle.com/javase/8/docs/ ,可以帮助你深入学习 Java 的语法和 API。 - **《Effective Java》**:一本经典的 Java 编程书籍,介绍了 Java 编程的最佳实践。 ######[AI写代码神器 | 1577点数解答 | 2026-05-08 19:13:24]
- C++实现:根据输入半径计算圆的直径、周长和面积(字节豆包 | 382点数解答 | 2026-02-02 17:41:00)63
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)438
- Java实现形状继承与多态,计算周长和面积(字节豆包 | 1577点数解答 | 2026-05-08 19:13:24)4
- Python 代码:计算多个球体与圆柱体的表面积和体积之和(讯飞星火 | 614点数解答 | 2024-06-13 19:29:36)246
- Java 实现:从点类到圆类,计算圆心坐标(50,30)、半径 4 的圆周长与面积(字节豆包 | 246点数解答 | 2024-11-11 16:36:30)358
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)337
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1232
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)383
- Java 实现交通工具类继承:从 Vehicles 到 Car 的完整示例(字节豆包 | 289点数解答 | 2024-09-18 16:16:54)254
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)352
- "Java Code: Uncovering Stock Statistics through CSV File Reading"(字节豆包 | 66点数解答 | 2024-11-13 15:31:04)347
- C++ 实战:交通工具基类与小汽车类的继承实现及测试(字节豆包 | 391点数解答 | 2024-09-18 16:16:39)279