来自重写方法的OOP java Stack Overflow
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自重写方法的OOP java Stack Overflow相关的知识,希望对你有一定的参考价值。
这是一个初学OOP问题,可能有很多答案,但我找不到它们。我会试着在这里问,希望有人可以解释或指出我正确的方向。
作为一个例子考虑我的MWE,其中RightTriangle
延伸扩展Rectangle
的Shapes
。方法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)--面向对象三大特性之一:多态(多态方法绑定instanceof和类型转换(重写重载和多态的关系))