我正在编写一个程序,其中覆盖的方法必须调用父类中的方法,而父类又必须调用重写方法的原始方法。然后,重写的方法也必须调用其父方法。
这是我的代码:
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>
答案 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有这个问题。