看第一段代码
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();可以无限引用,但是有没有形成死循环,这是为什么?有人可以从内存角度分析一下上述第二种代码吗?
4 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
第一段代码new Test()时候会执行public Test test = new Test(); ,之后继续进入new Test(),造成死循环、无限实例化,最后内存溢出;
第二段代码public static Test test = new Test(); 是在类加载的时候执行,每次new Test()时候不会重复执行,所以不会重复实例化变量
喵喵时光机
TA贡献1846条经验 获得超7个赞
new Test().test.test.test.test.test.say() == new Test().say() == Test.say()
new Test().test.test.test.test.test == new Test().test == Test.test。不管你调用多少次.test都是指向一个堆地址。
拉丁的传说
TA贡献1789条经验 获得超8个赞
第一个段代码是在无线创建对象,每次都会消耗内存创建新对象
第二段代码类似两个对象的互相引用,没有新对象产生,没有内存消耗
A a = new A();
B b = new B();
a.b = b;
b.a = a;
这样就能a.b.a.b.a.b这样无线循环引用,但是无论写了多少层,引用的都是这两个对象
添加回答
举报
0/150
提交
取消
