这是一个初学者的OOP问题,可能有很多答案,但我一直找不到它们。我会尝试在这里询问,希望有人能解释或指出我正确的方向。
作为一个示例,请考虑我的 MWE,其中 RightTriangle
扩展了 矩形
,而 矩形
又扩展了 Shapes
。 semiPerimeter()
方法是通过调用 perimeter()
实现的。
对于矩形
来说一切都很好,其中perimeter()
和semiPerimeter()
都可以工作。问题是 RightTriangle
的 perimeter()
方法覆盖了 Rectangle
perimeter()
。运行测试时,我收到 StackOverflowError,因为 semiPerimeter()
调用 perimeter()
,而 perimeter()
又调用 semiPerimeter()
。
为什么 super.semiPerimeter()
调用不使用矩形父类(super class)中的 perimeter()
?
MWE
Shapes.java
package ShapesPackage;
public abstract class Shapes {
public abstract double perimeter();
public double semiPerimeter() {
return perimeter() / 2;
}
}
矩形.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
}
}
测试.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()) 确实从 Shapes
类调用 semiPerimeter
方法,该方法又从 调用
perimeter
rightTriangle 再次上课并重复。
请注意,new rightTriangle()
基本上意味着 return perimeter()/2
将从 rightTriangle
调用 perimeter
方法 类。
关于java - 来自重写方法的 OOP java 堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52841157/