很抱歉标题不好,但我不确定我的问题叫什么。 (如果可以,请在回答中告诉我)我有两个类(class)正在尝试与之互动。 “设置”类在“开始”类中有我需要的变量,反之亦然。我尝试通过以下方式在“开始”类中扩展类“设置”:
public class Begin extends Setup {
需要注意的是,我确实以这种方式在“设置”类中引用了“开始”类:
Begin b = new Begin();
我还尝试在每个类中引用“设置”和“开始”类。这没有帮助。我在两个类中都收到了“java.lang.StackOverflowError”错误。我在引用其他类(class)时遇到错误。 (“开始”中的错误:“设置 s = 新设置();”“设置”中的错误:“开始 b = 新开始();”)
我不知道为什么会收到此错误,而且我不知道什么是正确调用类的“引用”。如果这是重复的,我深表歉意。如果是,请将我链接到该页面。如果没有,请告诉我如何使我的程序再次正常运行。我在本主题中提到的代码和类只是示例。它们不是我正在使用的类。我认为注意到我正在使用 JFrame 可能会有所帮助。我只将一个类扩展到 JFrame,但两个类都在使用 JFrame。我在没有扩展 JFrame 的类中创建了一个新的 JFrame。如果您无法给出您认为有帮助的答案,我将发布我的两个类(class)的代码。 提前致谢! ~雷恩
编辑:谢谢大家!我真的很高兴你能用我举的例子帮助我。再次感谢!
最佳答案
您正在进行无限递归。
- 开始扩展设置,
- 因此 Begin 的构造函数必须调用 Setup 的构造函数,并初始化它的 super Setup 属性
- 安装程序在内部创建另一个 Begin 实例
- 这将初始化另一个super Setup 实例
- 创建另一个 Begin 实例
- 这将初始化另一个super Setup 实例
- 创建另一个 Begin 实例
- 这将初始化另一个super Setup 实例
- 创建另一个 Begin 实例
- ...等等,直到内存不足
不要那样做。您需要更改程序的整个结构,因为父类(super class)不应该知道其子类,更不用说它的实例了。我敢打赌,Begin 不应扩展 Setup,这就是我要开始的地方。事实上这种情况:
Class 'Setup' has variables I need in class 'Begin', and vice versa.
不是通过继承解决的,而是通过组合解决的。例如……
public class Begin {
private Setup setup;
public void setSetup(Setup setup) {
this.setup = setup;
}
而且也许也是
public class Setup {
private Begin begin;
public void setBegin(Begin begin) {
this.begin = begin;
}
然后在别处:
Begin begin = new Begin();
Setup setup = new Setup();
begin.setSetup(setup);
setup.setBegin(begin);
还有其他注入(inject)依赖的方法,具体取决于您的需要,所以不要以此为福音,除了不要为此目的使用继承。
关于java - 当我引用两个类时出现 StackOverflow 错误。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26004651/