ITPub博客

首页 > 应用开发 > IT综合 > Java面向对象编程实践:类设计构造方法重载与图形计算

Java面向对象编程实践:类设计构造方法重载与图形计算

投稿 IT综合 作者:bhluo 时间:2025-11-25 11:42:44 0 删除 编辑

**Java面向对象编程实践:类设计构造方法重载与图形计算**


面向对象编程是Java的核心特性,通过类的设计、构造方法重载和实际应用案例,可以深入理解Java的面向对象思想。本文将通过图形面积计算系统展示这些核心概念。


### 类的设计与封装基础


良好的类设计是面向对象编程的基础,封装保证了数据的安全性和代码的可维护性。


```java

// 图形基类 - 抽象概念

abstract class Shape {

    // 封装:私有字段 + 公共访问方法

    private String name;

    private String color;

    

    // 静态变量 - 所有图形共享

    private static int shapeCount = 0;

    

    // 构造方法

    public Shape(String name, String color) {

        this.name = name;

        this.color = color;

        shapeCount++;

        System.out.println("创建图形: " + name + ",总图形数: " + shapeCount);

    }

    

    // 获取器和设置器 - 封装的体现

    public String getName() {

        return name;

    }

    

    public void setName(String name) {

        if (name != null && !name.trim().isEmpty()) {

            this.name = name;

        }

    }

    

    public String getColor() {

        return color;

    }

    

    public void setColor(String color) {

        if (color != null && !color.trim().isEmpty()) {

            this.color = color<"UF.6370.HK">;

        }

    }

    

    public static int getShapeCount() {

        return shapeCount;

    }

    

    // 抽象方法 - 强制子类实现

    public abstract double calculateArea();

    public abstract double calculatePerimeter();

    

    // 具体方法 - 所有图形共享的实现

    public void displayInfo() {

        System.out.println("图形名称: " + name);

        System.out.println("图形颜色: " + color);

        System.out.println("图形面积: " + String.format("%.2f", calculateArea()));

        System.out.println("图形周长: " + String.format("%.2f", calculatePerimeter()));

    }

}

```


### 构造方法重载实战


构造方法重载提供了创建对象的不同方式,增强了类的灵活性。


```java

// 矩形类 - 展示构造方法重载

class Rectangle extends Shape {

    private double width;

    private double height;

    

    // 构造方法1:基本构造方法

    public Rectangle(double width, double height) {

        super("矩形", "蓝色");

        setDimensions(width, height);

    }

    

    // 构造方法2:带名称和颜色

    public Rectangle(String name, String color, double width, double height) {

        super(name, color);

        setDimensions(width, height);

    }

    

    // 构造方法3:正方形特化

    public Rectangle(double side) {

        super("正方形", "红色");

        this.width = side;

        this.height = side;

    }

    

    // 构造方法4:默认构造方法

    public Rectangle() {

        super("默认矩形", "黑色");

        this.width = 1.0;

        this.height = 1.0;

    }

    

    // 私有方法辅助构造方法

    private void setDimensions(double width, double height) {

        if (width > 0 && height > 0) {

            this.width = width;

            this.height = height;

        } else {

            throw new IllegalArgumentException("宽度和高度必须大于0");

        }

    }

    

    // 实现抽象方法

    @Override

    public double calculateArea() {

        return width * height;

    }

    

    @Override

    public double calculatePerimeter() {

        return 2 * (width + height);

    }

    

    // 特有方法

    public boolean isSquare() {

        return Math.abs(width - height) < 0.0001;

    }

    

    // 重写显示信息方法

    @Override

    public void displayInfo() {

        super.displayInfo();

        System.out.println("矩形宽度: " + width);

        System.out.println("矩形高度: " + height);

        System.out.println("是否为正方形: " + (isSquare() ? "是" : "否"));

        System.out.println("------------------------");

    }

    

    // 获取器和设置器

    public double getWidth() {

        return width;

    }

    

    public void setWidth(double width) {

        if (width > 0) <"GD.6370.HK">{

            this.width = width;

        }

    }

    

    public double getHeight() {

        return height;

    }

    

    public void setHeight(double height) {

        if (height > 0) {

            this.height = height;

        }

    }

}

```


### 圆形类的设计与实现


圆形类展示不同的几何图形实现方式。


```java

// 圆形类

class Circle extends Shape {

    private double radius;

    public static final double PI = 3.141592653589793;

    

    // 构造方法重载

    public Circle(double radius) {

        super("圆形", "绿色");

        setRadius(radius);

    }

    

    public Circle(String name, String color, double radius) {

        super(name, color);

        setRadius(radius);

    }

    

    public Circle() {

        super("默认圆形", "黄色");

        this.radius = 1.0;

    }

    

    private void setRadius(double radius) {

        if (radius > 0) {

            this.radius = radius;

        } else {

            throw new IllegalArgumentException("半径必须大于0");

        }

    }

    

    @Override

    public double calculateArea() {

        return PI * radius * radius;

    }

    

    @Override

    public double calculatePerimeter() {

        return 2 * PI * radius;

    }

    

    // 圆形特有方法

    public double calculateDiameter() {

        return 2 * radius;

    }

    

    @Override

    public void displayInfo() {

        super.displayInfo();

        System.out.println("圆形半径: " + radius);

        System.out.println("圆形直径: " + calculateDiameter());

        System.out.println("------------------------");

    }

    

    public double getRadius() {

        return radius;

    }

    

    public void setRadius(float radius) {

        if (radius > 0) {

            this.radius = radius;

        }

    }

}

```


### 三角形类的复杂设计


三角形类展示更复杂的几何计算和验证逻辑。


```java

// 三角形类

class Triangle extends Shape {

    private double sideA;

    private double sideB;

    private double sideC;

    

    // 构造方法1:三边构造

    public Triangle(double a, double b, double c) {

        super("三角形", "橙色")<"TU.6370.HK">;

        if (isValidTriangle(a, b, c)) {

            this.sideA = a;

            this.sideB = b;

            this.sideC = c;

        } else {

            throw new IllegalArgumentException("无效的三角形边长");

        }

    }

    

    // 构造方法2:等腰三角形

    public Triangle(double base, double equalSides) {

        super("等腰三角形", "紫色");

        if (isValidTriangle(base, equalSides, equalSides)) {

            this.sideA = base;

            this.sideB = equalSides;

            this.sideC = equalSides;

        } else {

            throw new IllegalArgumentException("无效的等腰三角形边长");

        }

    }

    

    // 构造方法3:等边三角形

    public Triangle(double side) {

        super("等边三角形", "粉色");

        if (side > 0) {

            this.sideA = side;

            this.sideB = side;

            this.sideC = side;

        } else {

            throw new IllegalArgumentException("边长必须大于0");

        }

    }

    

    // 验证三角形有效性

    private boolean isValidTriangle(double a, double b, double c) {

        return a > 0 && b > 0 && c > 0 &&

               a + b > c && a + c > b && b + c > a;

    }

    

    @Override

    public double calculateArea() {

        // 使用海伦公式计算面积

        double s = calculatePerimeter() / 2;

        return Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC));

    }

    

    @Override

    public double calculatePerimeter() {

        return sideA + sideB + sideC;

    }

    

    // 三角形分类方法

    public String getTriangleType() {

        if (sideA == sideB && sideB == sideC) {

            return "等边三角形";

        } else if (sideA == sideB || sideA == sideC || sideB == sideC) {

            return "等腰三角形";

        } else {

            return "不等边三角形";

        }

    }

    

    // 判断是否为直角三角形

    public boolean isRightTriangle() {

        double[] sides = {sideA, sideB, sideC};

        java.util.Arrays.sort(sides);

        return Math.abs(sides[2] * sides[2] - (sides[0] * sides[0] + sides[1] * sides[1])) < 0.0001;

    }

    

    @Override

    public void displayInfo() {

        super.displayInfo();

        System.out.println("三角形边长: " + sideA + ", " + sideB + ", " + sideC);

        System.out.println("三角形类型: " + getTriangleType());

        System.out.println("是否为直角三角形: " + (isRightTriangle() ? "是" : "否"));

        System.out.println("------------------------");

    }

    

    // 获取器

    public double getSideA() {

        return sideA;

    }

    

    public double getSideB() {

        return sideB;

    }

    

    public double getSideC() {

        return sideC;

    }

}

```


### 图形管理系统实现


创建一个图形管理系统来管理各种图形对象。


```java

import java.util.ArrayList;

import java.util.List;


// 图形管理系统

class ShapeManager {

    private List<Shape> shapes;

    

    public ShapeManager() {

        shapes = new ArrayList<>();

    }

    

    // 添加图形

    public void addShape(Shape shape) {

        if (shape != null) <"KW.6370.HK">{

            shapes.add(shape);

            System.out.println("添加图形: " + shape.getName());

        }

    }

    

    // 显示所有图形信息

    public void displayAllShapes() {

        System.out.println("\n=== 所有图形信息 ===");

        if (shapes.isEmpty()) {

            System.out.println("没有图形数据");

            return;

        }

        

        for (int i = 0; i < shapes.size(); i++) {

            System.out.println("图形 #" + (i + 1) + ":");

            shapes.get(i).displayInfo();

        }

    }

    

    // 计算总面积

    public double calculateTotalArea() {

        double totalArea = 0;

        for (Shape shape : shapes) {

            totalArea += shape.calculateArea();

        }

        return totalArea;

    }

    

    // 计算总周长

    public double calculateTotalPerimeter() {

        double totalPerimeter = 0;

        for (Shape shape : shapes) {

            totalPerimeter += shape.calculatePerimeter();

        }

        return totalPerimeter;

    }

    

    // 按类型统计

    public void displayStatistics() {

        System.out.println("\n=== 图形统计信息 ===");

        System.out.println("总图形数量: " + shapes.size());

        System.out.println("系统总图形数: " + Shape.getShapeCount());

        System.out.println("总面积: " + String.format("%.2f", calculateTotalArea()));

        System.out.println("总周长: " + String.format("%.2f", calculateTotalPerimeter()));

        

        // 按类型统计

        int rectangles = 0, circles = 0, triangles = 0;

        for (Shape shape : shapes) {

            if (shape instanceof Rectangle) rectangles++;

            else if (shape instanceof Circle) circles++;

            else if (shape instanceof Triangle) triangles++;

        }

        

        System.out.println("矩形数量: " + rectangles);

        System.out.println("圆形数量: " + circles);

        System.out.println("三角形数量: " + triangles);

    }

    

    // 查找面积最大的图形

    public Shape findLargestShape() {

        if (shapes.isEmpty()) return null;

        

        Shape largest = shapes.get(0);

        for (Shape shape : shapes) {

            if (shape.calculateArea() > largest.calculateArea()) {

                largest = shape;

            }

        }

        return largest;

    }

    

    // 按名称搜索图形

    public List<Shape> findShapesByName(String name) {

        List<Shape> result = new ArrayList<>();

        for (Shape shape : shapes) {

            if (shape.getName().toLowerCase().contains(name.toLowerCase())) {

                result.add(shape);

            }

        }

        return result;

    }

}

```


### 综合实验演示


创建完整的演示程序展示所有功能。


```java

public class ShapeCalculationSystem {

    

    public static void main(String[] args) {

        System.out.println("Java面向对象实验:图形面积计算系统");

        System.out.println("================================\n");

        

        // 创建图形管理器

        ShapeManager manager = new ShapeManager();

        

        // 演示构造方法重载

        System.out.println("=== 构造方法重载演示 ===");

        

        // 矩形构造方法重载

        Rectangle rect1 = new Rectangle(5.0, 3.0);          // 基本构造

        Rectangle rect2 = new Rectangle("大矩形", "深蓝色", 8.0, 6.0); // 带名称颜色

        Rectangle square1 = new Rectangle(4.0);             // 正方形

        Rectangle defaultRect = new Rectangle();            // 默认构造

        

        // 圆形构造方法重载

        Circle circle1 = new Circle(3.0);                   // 基本构造

        Circle circle2 = new Circle("大圆形", "深绿色", 5.0); // 带名称颜色

        Circle defaultCircle = new Circle();                // 默认构造

        

        // 三角形构造方法重载

        Triangle triangle1 = new Triangle(3.0, 4.0, 5.0);  // 普通三角形

        Triangle isosceles = new Triangle(6.0, 5.0);       // 等腰三角形

        Triangle equilateral = new Triangle(4.0);          // 等边三角形

        

        // 添加所有图形到管理器

        manager.addShape(rect1);

        manager.addShape(rect2);

        manager.addShape(square1);

        manager.addShape(defaultRect);

        manager.addShape(circle1);

        manager.addShape(circle2);

        manager.addShape(defaultCircle);

        manager.addShape(triangle1);

        manager.addShape(isosceles);

        manager.addShape(equilateral);

        

        // 显示所有图形信息

        manager.displayAllShapes();

        

        // 显示统计信息

        manager.displayStatistics();

        

        // 查找最大图形

        Shape largest = manager.findLargestShape();

        if (largest != null) <"RZ.6370.HK">{

            System.out.println("\n=== 面积最大的图形 ===");

            largest.displayInfo();

        }

        

        // 搜索演示

        System.out.println("\n=== 图形搜索演示 ===");

        List<Shape> foundShapes = manager.findShapesByName("大");

        System.out.println("找到 " + foundShapes.size() + " 个包含'大'的图形:");

        for (Shape shape : foundShapes) {

            System.out.println("  - " + shape.getName());

        }

        

        // 演示图形特性

        demonstrateShapeFeatures();

        

        // 演示异常处理

        demonstrateExceptionHandling();

    }

    

    // 演示图形特有功能

    private static void demonstrateShapeFeatures() {

        System.out.println("\n=== 图形特有功能演示 ===");

        

        // 矩形正方形判断

        Rectangle rect = new Rectangle(5.0, 5.0);

        System.out.println("5x5矩形是否为正方形: " + rect.isSquare());

        

        // 三角形类型判断

        Triangle rightTriangle = new Triangle(3.0, 4.0, 5.0);

        System.out.println("3-4-5三角形类型: " + rightTriangle.getTriangleType());

        System.out.println("3-4-5三角形是否为直角三角形: " + rightTriangle.isRightTriangle());

        

        // 圆形直径计算

        Circle circle = new Circle(2.0);

        System.out.println("半径2的圆形直径: " + circle.calculateDiameter());

    }

    

    // 演示异常处理

    private static void demonstrateExceptionHandling() {

        System.out.println("\n=== 异常处理演示 ===");

        

        try {

            // 无效矩形

            Rectangle invalidRect = new Rectangle(-1.0, 5.0);

        } catch (IllegalArgumentException e) {

            System.out.println("捕获异常: " + e.getMessage());

        }

        

        try {

            // 无效三角形

            Triangle invalidTriangle = new Triangle(1.0, 2.0, 10.0);

        } catch (IllegalArgumentException e) {

            System.out.println("捕获异常: " + e.getMessage());

        }

        

        try {

            // 无效圆形

            Circle invalidCircle = new Circle(-2.0);

        } catch (IllegalArgumentException e) {

            System.out.println("捕获异常: " + e.getMessage());

        }

    }

}

```


### 高级特性扩展


```java

// 可比较接口实现

class ComparableRectangle extends Rectangle implements Comparable<ComparableRectangle> {

    

    public ComparableRectangle(double width, double height) {

        super(width, height);

    }

    

    @Override

    public int compareTo(ComparableRectangle other) {

        return Double.compare(this.calculateArea(), other.calculateArea());

    }

}


// 图形工厂类

class ShapeFactory {

    

    public static Shape createShape(String type, double... dimensions) {

        switch (type.toLowerCase()) {

            case "rectangle":

                if (dimensions.length == 2) {

                    return new Rectangle(dimensions[0], dimensions[1]);

                }

                break;

            case "circle":

                if (dimensions.length == 1) {

                    return new Circle(dimensions[0]);

                }

                break;

            case "triangle":

                if (dimensions.length == 3) {

                    return new Triangle(dimensions[0], dimensions[1], dimensions[2]);

                }

                break;

            case "square":

                if (dimensions.length == 1) {

                    return new Rectangle(dimensions[0]);

                }

                break;

        }

        throw new IllegalArgumentException("不支持的图形类型或参数");

    }

    

    public static void demonstrateFactory() {

        System.out.println<"MV.6370.HK">("\n=== 图形工厂演示 ===");

        

        Shape rect = ShapeFactory.createShape("rectangle", 4.0, 5.0);

        Shape circle = ShapeFactory.createShape("circle", 3.0);

        Shape triangle = ShapeFactory.createShape("triangle", 3.0, 4.0, 5.0);

        Shape square = ShapeFactory.createShape("square", 4.0);

        

        rect.displayInfo();

        circle.displayInfo();

        triangle.displayInfo();

        square.displayInfo();

    }

}

```


### 实验总结与最佳实践


通过这个图形面积计算系统,我们实践了以下面向对象核心概念:


1. **类的设计原则**:

   - 封装:私有字段和公共访问方法

   - 继承:抽象基类和具体子类

   - 多态:抽象方法和具体实现


2. **构造方法重载价值**:

   - 提供多种对象创建方式

   - 增强类的灵活性和易用性

   - 支持特殊情况的快速创建


3. **代码组织技巧**:

   - 使用管理器类组织相关对象

   - 工厂模式简化对象创建

   - 异常处理保证程序健壮性


4. **实际应用扩展**:

   - 可以添加更多图形类型(椭圆、梯形等)

   - 实现图形序列化保存和加载

   - 添加图形编辑和变换功能


这个实验系统展示了Java面向对象编程的强大能力,为开发更复杂的应用程序奠定了坚实基础。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3103336/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933780