You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:14:11