从内部 class 访问父方法时出现 StackOverflowError

StackOverflowError while accessing parent method from inner class

请帮我找出为什么在 运行 下面的代码时出现 WhosebugError 异常。

public class HelloParent {

    HelloParent checking = new HelloParent();

    public class Hello{

        public void printFunction() {
            checking.printHW("hello ");
        }

    }

    private void printHW(String s){
        System.out.println(s);
    }

    public static void main(String[] args) {
        HelloParent helloParent = new HelloParent();
        Hello hello = helloParent.new Hello();
        hello.printFunction();

    }
}

我在这里尝试从内部 class.

访问父 class 方法

这是无限循环的原因:

HelloParent checking = new HelloParent();

删除它!

当您在 main 中创建一个新的 HelloParent 对象时,您又会在该对象中创建一个 HelloParent 对象,依此类推。这会导致您的堆栈填满并最终溢出。这会抛出 WhosebugError.


希望对您有所帮助!

HelloParent 有一个实例字段,checking,它是这样声明和初始化的:

HelloParent checking = new HelloParent();

该代码被插入到每个 HelloParent 构造函数*的开头。该代码 调用 HelloParent 构造函数,因此再次获得 运行,因此再次调用构造函数,因此再次获得 运行,等等,等等

您不能有一个实例字段调用它在其中定义的 class 的构造函数。


* 从技术上讲,就在调用 super().

之后(在本例中是隐含的)

Here I am trying to access parent class method from the inner class.

对于内部classes,正确的术语是"enclosing class"而不是"parent class",因为这里没有继承关系。

您可以通过调用 :

访问封闭实例(与您的 Hello 实例关联的 HelloParent 实例)的方法
    public void printFunction() {
        printHW("hello ");
    }

    public void printFunction() {
        HelloParent.this.printHW("hello ");
    }

您不需要在 HelloParent class 中创建另一个 HelloParent 的实例(正如其他人所解释的,这是 WhosebugError 的原因),所以你可以删除 checking 变量。