【问题标题】:Calling an Overridden Super Method Causes Infinite Recursion调用重写的超级方法会导致无限递归
【发布时间】:2016-06-02 01:19:57
【问题描述】:

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

这是我的代码:

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 行是 float dogBark = dog();Cow 中的第 63 行是 float meowz = hiCat();

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

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

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

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

主要方法与手头的方法完全无关:

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

【问题讨论】:

  • 你能添加你的main()方法吗?
  • 你覆盖了hiCat。所以Moo.htCat 调用Cow.dog,后者调用Moo.hiCat。无限循环。

标签: java inheritance methods overriding stack-overflow


【解决方案1】:

这里有一个类似的问题,有正确的解释:Java: Calling a super method which calls an overridden method

我通过将dog() 中的meowz 变量更改为类变量来解决了我的特定问题,然后hiCat() 可以保存到该变量,因此无需从dog() 调用hiCat() 并避免无限递归。

请注意,我也在 C# 中对此进行了测试,并且它确实适用于此设置。看来只有Java有这个问题。

【讨论】:

    【解决方案2】:

    您在方法之间创建了循环依赖关系。处理此类情况的最佳方法是重构代码并创建私有方法 _hiCat()

    public class Cow 
    {
    
    private float _hiCat()
    {
       ...
       return meow;
    }
    
    public float hiCat()
    {
       return _hiCat();
    }
    
    public float dog()
    {
       float meowz = _hiCat();
       ...
    }
    }
    
    public class Moo extends Cow
    {
     public float hiCat()
    {
    float dogBark = dog();
    float meows = super.hiCat();
    ...
    }
    }
    

    【讨论】:

      【解决方案3】:

      这是因为你在hiCat()的重写方法里面调用了dog(),然后当你执行该方法时,这行float dogBark = dog()调用dog()方法然后在超类的dog()方法里面再次调用hiCat();hiCat(); 再次调用dog() 因为hiCat(); 方法被子类覆盖然后它将调用hiCat(); 方法的覆盖之一.....所以StackOverflowError 发生

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 2014-01-10
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多