调用重写的超级方法会导致无限递归

时间:2016-02-20 11:43:05

标签: java inheritance methods override 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行为float dogBark = dog();Cow中的第63行为float meowz = hiCat();

我认为第63行是dog()中的问题。

似乎hiCat()中的class Moo正在调用dog() class Cow中的dog(),但hiCat()正在调用hiCat()的覆盖版本1}}而不是与它共享一个类的那个。这让我感到困惑,因为我以常规方式调用public static void main(String[] args) { InputClass input = new InputClass(); input.GenerateGUI(); } 而没有修饰符或任何东西。

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

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

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

<head>
    <script src="dist/sweetalert.min.js"></script> 
    <link rel="stylesheet" type="text/css" href="dist/sweetalert.css"> 
</head>
<body>
    <div class="showcase sweet">
     <h4>Sweet Alert</h4>
     <button>Show error message</button>
        
     <h5>Code:</h5>
    	<pre>
            <span class="attr">sweetAlert</span>(<span class="str">"Oops..."</span>,
            <span class="str">"Something went wrong!"</span>,
            <span class="str">"error"</span>);
        </pre>
    </div>
</body>

<script>
  document.querySelector('.showcase.sweet button').onclick = function(){
	swal("Oops...", "Something went wrong!", "error");
  };
</script>

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您在方法中创建了循环依赖关系。处理这类情况的最佳方法是重构代码并创建私有方法_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();
...
}
}

答案 2 :(得分:0)

此处存在类似的问题,其中有正确的解释:http://www.sqlservercentral.com/blogs/querying-microsoft-sql-server/2013/09/19/how-to-split-a-string-by-delimited-char-in-sql-server/

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

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