来自重写方法的OOP java Stack Overflow

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自重写方法的OOP java Stack Overflow相关的知识,希望对你有一定的参考价值。

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

作为一个例子考虑我的MWE,其中RightTriangle延伸扩展RectangleShapes。方法semiPerimeter()通过调用perimeter()实现。

一切都很好Rectangle,其中perimeter()semiPerimeter()工作。问题是perimeter()RightTriangle方法,它超越了Rectangle perimeter()。运行测试时,我得到一个StackOverflowError,因为semiPerimeter()调用perimeter(),而semiPerimeter()又调用super.semiPerimeter()

为什么perimeter()调用不使用矩形超类中的package ShapesPackage; public abstract class Shapes { public abstract double perimeter(); public double semiPerimeter() { return perimeter() / 2; } }


MWE

shapes.Java

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

rectangle.Java

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

right triangle.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
    }
}

test.Java

semiPerimeter
答案

你的方法(t.perimeter())确实从Shapes类调用perimeter方法,后者又从rightTriangle类中调用new rightTriangle()并重复此操作。

请注意,return perimeter() / 2基本上意味着perimeter将从rightTriangle类调用super.semiPerimeter()方法。

另一答案

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

因为你在perimeter()对象上调用了它,它覆盖了perimiter()方法。调用rectangle调用rightTriangle类是没有意义的,因为它是一个StackOverflowError对象。因此,这两种方法不断调用自己,导致t.perimeter()

另一答案

这是发生了什么:

你打电话给super.semiPerimeter(),它叫perimeter() - > super.semiPerimeter() - > perimeter等等。

听起来你已经知道了。我相信当你扩展一个类时,如果你创建一个与父类具有相同签名的方法,你可以覆盖它,使任何调用都转到你的覆盖方法而不是原始方法。抽象类调用的this.perimeter是隐含的this,什么是rightTriangle?这是一个perimeter。因此,当你的抽象类看到rightTriangle时,它会看到你用qazxswpoi制作的那个。

以上是关于来自重写方法的OOP java Stack Overflow的主要内容,如果未能解决你的问题,请参考以下文章

java第五章:面向对象(oop)

Java面向对象(OOP)--面向对象三大特性之一:多态(多态方法绑定instanceof和类型转换(重写重载和多态的关系))

Java面向对象(OOP)--面向对象三大特性之一: 继承(继承Object类Super关键字方法重写)

java第五章:面向对象(oop)三大特性之多态

java-oop 堆栈

在 C++ 中调用辅助类的重写方法