来自重写方法的OOP java Stack Overflow

问题描述 投票:0回答:3

这是一个初学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
java oop methods
3个回答
3
投票

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

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


2
投票

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

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


1
投票

这是发生了什么:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.