在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已经为Foo
class跑了
现在,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 }
}