看第一段代码
public class Test {
public Test test = new Test();
public void say() {
System.out.println("hello world!");
}
public static void main(String[] args) {
new Test();
}
}
上边这段代码会造成死循环并导致内存溢出,接下来看第二段代码
public class Test {
public static Test test = new Test();
public void say() {
System.out.println("hello world!");
}
public static void main(String[] args) {
// 可以无限引用下去,但不会形成死循环
new Test().test.test.test.test.test.say();
}
}
上述第二段代码中,new Test().test.test.test.test.test.say();
可以无限引用,但是有没有形成死循环,这是为什么?有人可以从内存角度分析一下上述第二种代码吗?
第一段代码
new Test()
时候会执行public Test test = new Test();
,之后继续进入new Test()
,造成死循环、无限实例化,最后内存溢出;第二段代码
public static Test test = new Test();
是在类加载的时候执行,每次new Test()
时候不会重复执行,所以不会重复实例化变量