java - 来自重写方法的 OOP java 堆栈溢出

标签 java oop methods

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

作为一个示例,请考虑我的 MWE,其中 RightTriangle 扩展了 矩形,而 矩形 又扩展了 ShapessemiPerimeter() 方法是通过调用 perimeter() 实现的。

对于矩形来说一切都很好,其中perimeter()semiPerimeter()都可以工作。问题是 RightTriangleperimeter() 方法覆盖了 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/

相关文章:

java - 迭代器 next 方法

java - Java中的executeBatch不维护记录的顺序

java - 使用辅助类引用创建的对象

javascript - 在javascript中,构造对象时,无法使用其他对象的方法

使用 C 中的单元测试进行更正

java - 数据库版本控制系统

java - 在 JSP 中根据第一个选择填充第二个选择

java - JComboBox 设置标签和值

java - 在运行时使用附加信息增强 Java 中现有数据结构的设计模式

php - OOP PHP 和 'Get-Set'