在main方法之外创建对象时出现stackoverflow错误

运行此代码时,它显示Stackoverflow错误。 我做错了什么,为什么代码编译?

public class Foo { int a = 5; Foo f = new Foo(); void go() { System.out.println(fa); } public static void main(String[] args) { Foo f2 = new Foo(); f2.go(); } } 

您只能使用实例调用go方法。 所以在打电话开始之前,c’tor已经为Fooclass跑了

现在,C’tor旨在初始化所有实例成员。

所以它一个接一个地初始化:

a初始化为5

f被初始化为一个对象//但是这里是catch,f永远不会被启动。

=运算符工作之前,调用C’tor,因此链继续。

如果你看到堆栈跟踪,它将在其中写入init 。 所以它只在初始化期间失败了。

 Foo f=new Foo(); 

您创建了一个Foo实例,其变量本身就是Foo一个实例,并在构造函数中初始化它。

这会导致构造函数invokations的无限递归,直到你的堆栈空间不足。

这是你的初始化程序:

 public class Foo { int a=5; Foo f=new Foo(); 

每当构造一个新的Foo ,作为其初始化的一部分,它会尝试创建一个Foo并将其分配给f 。 但显然,构建Foo再次启动整个过程。

程序执行开始时,控制进入main方法,找到Foo f2 = new Foo()。 它创建了Foo的对象,在创建对象时,它必须实例化包含Foo f = new Foo()的所有实例变量,因此它再次创建一个新的Foo对象并加载其中的所有实例变量,并且它也找到相同的Foo f = new Foo(),所以它再次创建Foo对象,这将继续,直到堆栈溢出。

这可以通过改变Foo f = new Foo()来解决; to Foo f = null;

这基本上是一个小时前你的问题的转贴。 请花时间了解人们给你的答案。

您的代码与以下内容相同:

 public class Foo { Foo f = null; public Foo() { this.f = new Foo(); // recursion here } //do your other stuff } 

}