java - 调用重写的 super 方法会导致无限递归

标签 java inheritance methods overriding stack-overflow

我正在编写一个程序,其中重写的方法必须调用父类中的方法,而父类又必须调用被重写方法的原始方法。然后,被重写的方法还必须调用其父方法。

这是我的代码:

public class Cow 
{
  public float hiCat()
  {
    ...
    return meow;
  }

  public float dog()
  {
    float meowz = hiCat();
    ...
  }
}

public class Moo extends Cow
{
  public float hiCat()
  {
    float dogBark = dog();
    float meows = super.hiCat();
    ...
  }
}

这给了我一个堆栈溢出错误,如下所示:

Exception in thread "main" java.lang.StackOverflowError
at Moo.hiCat(Moo.java:12)
at Cow.dog(Cow.java:63)

Moo 中的第 12 行是 floatdogBark = dog();Cow 中的第 63 行是 float meowz = hiCat();

我相信第 63 行是 dog() 中的问题。

看起来class Moo中的hiCat()正在调用class Cow中的dog(),就像它应该的那样,但是dog()正在调用hiCat()的重写版本,而不是与之共享一个类的版本。这让我很困惑,因为我以常规方式调用 hiCat() ,没有任何修饰符或任何东西。

为什么会发生这种情况?我该如何解决?

注意:程序的结构必须保持不变。

Main 方法与手头的方法完全无关:

public static void main(String[] args) 
{
    InputClass input = new InputClass();
    input.GenerateGUI();
}

最佳答案

这是因为您在 hiCat() 的重写方法中调用 dog(),然后当您执行该方法时,此行 floatdogBark =dog() 调用 dog() 方法,然后在父类(super class)中的 dog() 方法内部再次调用 hiCat();hiCat(); 再次调用 dog() 因为 hiCat(); 方法被子类重写,所以它会调用被重写的 hiCat(); 方法......所以 StackOverflowError 发生

关于java - 调用重写的 super 方法会导致无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522743/

相关文章:

c++ - 在这种情况下是否有必要进行范围解析?

java - 使用三元运算符调用重载方法?

algorithm - Iterative recurrent... 迭代法

java - 如何设置我的 Netbeans IDE 来制作 Java ME 应用程序?

javac编译并执行2个java文件

java - 抽象类的子类包含无法访问抽象方法的实现的对象

android - Getview里面的Click方法被多次调用

java - 监控 Java 应用程序自己的内存使用情况

java - 将 ArrayList<ArrayList<Integer>> 转换为 List<List<Integer>>

c++ - 指向多重继承中继承的数据成员的指针