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
相关产品推荐
相关产品推荐

