这是一个初学者的OOP问题,可能有很多答案,但我一直找不到。我会在这里尝试提出问题,希望有人可以向我解释或指出正确的方向。

例如,考虑我的MWE,其中RightTriangle扩展了Rectangle,扩展了Shapes。方法semiPerimeter()通过调用perimeter()实现。

Rectangleperimeter()都适用的semiPerimeter()一切都很好。问题是perimeter()RightTriangle方法覆盖了Rectangle perimeter()。运行测试时,出现StackOverflowError,因为semiPerimeter()调用perimeter(),而semiPerimeter()依次调用super.semiPerimeter()

为什么perimeter()调用不使用矩形超类中的?



微机

Shapes.java

package ShapesPackage;
public abstract class Shapes {
    public abstract double perimeter();
    public double semiPerimeter() {
        return perimeter() / 2;
    }
}


Rectangle.java

package ShapesPackage;
public class Rectangle extends Shapes {
    public double perimeter() {
        return 2 * (3 + 4); //2*(length+height)
    }
}


RightTriangle.java

package ShapesPackage;
public class RightTriangle extends Rectangle {
    public double perimeter() {
        return super.semiPerimeter() + 5;  //half the rectangle perimeter plus some hypotenuse
    }
}


Test.java

package ShapesPackage;
public class Test {
    public static void main(String[] args) {
        Rectangle r = new rectangle();
        System.out.println(r.perimeter());
        System.out.println(r.semiPerimeter());
        RightTriangle t = new rightTriangle();
        System.out.println(t.perimeter());  //Fails
    }
}

最佳答案

您的方法(t.perimeter())确实从semiPerimeter类调用了Shapes方法,而该方法又从perimeter类调用了rightTriangle,并且重复了这一步骤。

请注意,new rightTriangle()基本上意味着return perimeter() / 2将调用perimeter类中的rightTriangle方法。

08-27 10:08