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

Java继承问题:调用子类getPerimeter与getArea方法失败求助

问题根源

你的代码编译报错的核心原因是:父类Shape中没有定义getPerimeter()和getArea()方法。Java多态机制的编译阶段会检查引用类型(此处为Shape)是否包含要调用的方法,只有父类声明了该方法,子类重写后,才能通过父类引用实现运行时的动态调用。

解决方案

1. 将Shape改为抽象类并添加抽象方法

把Shape定义为抽象类,同时声明getPerimeter()和getArea()为抽象方法。这样既符合“通用形状无法实例化”的逻辑,又强制所有子类必须实现这两个方法,父类引用也能正常调用这些方法。

2. 优化子类构造方法写法

子类构造方法不要直接访问父类的public成员变量,应该调用父类的构造方法(super()),这是继承场景下的规范写法。

修改后的代码

抽象父类Shape

public abstract class Shape {
    public String color;
    public boolean filled;

    public Shape() {
        color = "";
        filled = false;
    }

    // 新增带参数的构造方法,供子类调用初始化父类成员
    public Shape(String color, boolean filled) {
        this.color = color;
        this.filled = filled;
    }

    public String getColor() {
        return color;
    }

    public boolean getFilled() {
        return filled;
    }

    public String toString() {
        return getClass().getName();
    }

    // 声明抽象方法,强制子类实现
    public abstract double getPerimeter();
    public abstract double getArea();
}

子类Triangle(优化构造+修正面积计算)

public class Triangle extends Shape {
    private double side1;
    private double side2;
    private double side3;

    public Triangle(String color, boolean filled, double side1, double side2, double side3) {
        // 调用父类带参构造方法初始化父类成员
        super(color, filled);
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }

    @Override // 用@Override注解明确是重写父类方法
    public double getPerimeter() {
        return this.side1 + this.side2 + this.side3;
    }

    @Override
    public double getArea() {
        // 替换原错误逻辑,使用海伦公式计算三角形面积
        double semiPerimeter = (side1 + side2 + side3) / 2;
        return Math.sqrt(semiPerimeter * (semiPerimeter - side1) * (semiPerimeter - side2) * (semiPerimeter - side3));
    }
}

测试类Tester(无需修改,可正常运行)

import java.util.ArrayList;

public class Tester {
    public static void main(String arg[]) {
        ArrayList<Shape> shapes = new ArrayList<>();
        shapes.add(new Triangle("white", true, 3.0, 2.5, 2.0));
        shapes.add(new Rectangle("red", true, 2.0, 4.0));
        shapes.add(new Circle("yellow", false, 1.0));
        System.out.println("Starting shapes\n");
        for (Shape shape : shapes) {
            System.out.println(shape.toString()
                    + "[color=" + shape.getColor() + ", filled=" + shape.getFilled() + "]");
            System.out.println("Perimeter: " + shape.getPerimeter());
            System.out.println("Area: " + shape.getArea());
            System.out.println();
        }
    }
}
补充说明
  • 抽象类无法实例化,契合Shape作为通用父类的定位——不存在“通用形状”的实例,只有具体的三角形、矩形等。
  • @Override注解能帮助编译器检查是否正确重写了父类方法,避免拼写或参数匹配错误。
  • 原Triangle的面积计算逻辑不符合数学规则,已替换为海伦公式保证结果正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:15:29