这是一个初学者的OOP问题,可能有很多答案,但我一直找不到。我会在这里尝试提出问题,希望有人可以向我解释或指出正确的方向。
例如,考虑我的MWE,其中RightTriangle
扩展了Rectangle
,扩展了Shapes
。方法semiPerimeter()
通过调用perimeter()
实现。Rectangle
和perimeter()
都适用的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
方法。