请帮助我找到为什么在运行代码时运行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();
}
}
这里我试图从内部类中访问父类方法。
答案 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
变量。