Java中使用extend继承Gui类引发StackOverflowError问题求助
解决Java StackOverflowError:子类继承父类后循环实例化问题
嘿,我一眼就看出问题所在了——你遇到的java.lang.StackOverflowError是无限递归实例化导致的,咱们一步步拆解:
问题根源
看你的错误栈就能清晰看到循环调用链:
Gui.
(Gui.java:29) → Hashings. (Hashings.java:1) → Gui. (Gui.java:29) → ...
为什么会陷入这个死循环?核心原因有两个:
Hashings类继承了Gui类,Java规定子类实例化时会自动调用父类的构造方法。- 你在
Gui类的实例变量中直接写了Hashings h = new Hashings();——这意味着每次创建Gui对象时,都会立刻触发Hashings的实例化,而Hashings实例化又会调用Gui的构造,如此往复无限循环,直到栈内存被耗尽,抛出栈溢出错误。
修复方案
1. 移除循环实例化的代码
直接删掉Gui类中的这行代码:
Hashings h = new Hashings();
这行代码完全是多余的,也是引发问题的核心。如果你的业务逻辑确实需要用到Hashings的功能,不要在类的实例变量位置初始化,而是在需要的场景(比如按钮点击事件、某个业务方法内部)再创建实例。
2. 重新审视继承关系
你得先想清楚:Hashings真的需要继承Gui吗?
- 如果
Hashings是处理哈希逻辑的工具类,完全没必要继承界面类Gui,用组合代替继承会更合理(比如在Gui里按需创建Hashings实例,而非让Hashings成为Gui的子类)。 - 如果
Hashings是特殊的界面类,那也不应该在父类Gui里实例化子类,这违背了面向对象的设计原则。
修复后的Gui类核心代码示例
import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Gui extends JFrame { public static void main (String[] args) { // 在这里启动Gui实例 new Gui(); } BorderLayout b1 = new BorderLayout(); public int anzahl; public int ascii; int e; JTextField name = new JTextField(8); JButton confirm2 = new JButton("Einfügen"); JTextField name2 = new JTextField(5); JButton confirm3 = new JButton("Suchen"); JPanel b = new JPanel(); JPanel c = new JPanel(); JPanel a = new JPanel(); Label[] lab = new Label[10]; // 移除了引发循环的Hashings实例化代码 public Gui() { super(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { dispose(); } }); int frameWidth = 1280; int frameHeight = 700; // 原代码height设为7会让窗口几乎不可见,调整为合理值 setSize(frameWidth, frameHeight); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); int x = (d.width - getSize().width) / 2; int y = (d.height - getSize().height) / 2; setLocation(x, y); setTitle("Gui"); setResizable(false); b.add(name); b.add(confirm2); // 注意:原代码中的HashMethod变量未定义,需补充定义或删除此行 // b.add(HashMethod); c.add(name2); c.add(confirm3); this.add(b,BorderLayout.NORTH); this.add(a,BorderLayout.CENTER); this.add(c,BorderLayout.SOUTH); for(int i=0;i<10;i++){ lab[i]=new Label("leer"); } for(int i=0;i<10;i++){ a.add(lab[i]); } setVisible(true); } }
另外提两个小细节:原代码里frameHeight = 7会让窗口几乎看不见,建议改成合理数值;还有HashMethod变量未定义,需要补充定义或者删除那行代码,否则编译会报错。
内容的提问来源于stack exchange,提问作者Marko Reus
相关产品推荐
相关产品推荐

