You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java继承场景下如何将子类计算的属性值传递给父类并通过父类方法打印

Java面向对象继承问题修复方案

问题根因

  • 父类Figure的三个私有属性没有提供公开的赋值方法,子类无法将计算出的面积、周长写入父类属性,导致父类print方法一直输出初始化的默认值0和空字符串
  • 子类的calcArea、calcPerimeter仅返回了计算结果,没有执行赋值操作,计算值没有同步到父类属性
  • print方法本身已经包含输出逻辑,且返回值为void,不需要再在外层套System.out.println调用,该写法会直接编译报错
  • Square继承Rectangle的逻辑冗余,不需要单独定义边长属性,可直接复用父类的长宽属性

修复实现

1. 父类Figure修改

public class Figure {
    private double area;
    private double perimeter;
    private String name;

    public Figure() {
        this.area = 0.0;
        this.perimeter = 0.0;
        this.name = "";
    }

    // 新增setter方法供子类赋值
    public void setArea(double area) {
        this.area = area;
    }

    public void setPerimeter(double perimeter) {
        this.perimeter = perimeter;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 修复print方法的拼接逻辑,避免数值直接相加
    public void print() {
        System.out.printf("图形名称:%s,面积:%.2f,周长:%.2f%n", name, area, perimeter);
    }

    public static void main(String args[]) {
        Figure[] figureList = new Figure[3];
        figureList[0] = new Circle(5);
        figureList[1] = new Square(5);
        figureList[2] = new Rectangle(5, 9);

        for(int i=0;i<3;i++) {
            // 直接调用print即可,不需要再套System.out.println
            figureList[i].print();
        }
    }
}

2. Circle类修改

public class Circle extends Figure {
    private double radius;

    public Circle(double a) {
        this.radius= a;
        setName("圆形");
        // 计算后将结果赋值给父类属性
        setPerimeter(calcPerimeter());
        setArea(calcArea());
    }

    public double calcPerimeter(){
        return 2 * Math.PI * this.radius;
    }
    public double calcArea(){
        return Math.PI * this.radius * this.radius;
    }
    public void increase(int a){
        this.radius*=a;
        setArea(calcArea());
        setPerimeter(calcPerimeter());
    }
}

3. Rectangle类实现

public class Rectangle extends Figure {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
        setName("矩形");
        setPerimeter(calcPerimeter());
        setArea(calcArea());
    }

    public double calcArea() {
        return length * width;
    }

    public double calcPerimeter() {
        return 2 * (length + width);
    }
}

4. Square类简化实现

public class Square extends Rectangle {
    public Square(double a) {
        // 正方形长宽相等,直接调用父类矩形的构造方法即可,无需单独实现计算逻辑
        super(a, a);
        setName("正方形");
    }
}

运行输出示例

图形名称:圆形,面积:78.54,周长:31.42
图形名称:正方形,面积:25.00,周长:20.00
图形名称:矩形,面积:45.00,周长:28.00

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:27:03