从内部类访问父方法时的StackOverflowError

时间:2017-05-22 07:18:09

标签: java stack-overflow inner-classes

请帮助我找到为什么在运行代码时运行StackOverflowError Exception。

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();

    }
}

这里我试图从内部类中访问父类方法。

3 个答案:

答案 0 :(得分:3)

HelloParent有一个实例字段checking,它被声明并初始化为:

HelloParent checking = new HelloParent();

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

您不能拥有一个实例字段来调用它所定义的类的构造函数。

*从技术上讲,就在(隐式的,在这种情况下)调用super()之后。

答案 1 :(得分:1)

这是无限循环的原因:

HelloParent checking = new HelloParent();

删除它!

HelloParent中创建新的main对象时,您会在该对象内创建一个HelloParent对象,然后递归。这会导致堆栈填满并最终溢出。这会抛出StackOverflowError

希望这有帮助!

答案 2 :(得分:1)

  

这里我试图从内部类中访问父类方法。

对于内部课程,正确的术语是"封闭课程"不是"父类",因为这里没有继承关系。

您可以通过调用以下方式访问封闭实例的方法(与HelloParent实例关联的Hello实例):

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

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

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