为了账号安全,请及时绑定邮箱和手机立即绑定

Java 一个死循环问题

Java 一个死循环问题

翻过高山走不出你 2019-01-17 23:50:46
看第一段代码 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()时候不会重复执行,所以不会重复实例化变量

查看完整回答
反对 回复 2019-02-12
?
喵喵时光机

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都是指向一个堆地址。

查看完整回答
反对 回复 2019-02-12
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

第一个段代码是在无线创建对象,每次都会消耗内存创建新对象

第二段代码类似两个对象的互相引用,没有新对象产生,没有内存消耗
A a = new A();
B b = new B();
a.b = b;
b.a = a;
这样就能a.b.a.b.a.b这样无线循环引用,但是无论写了多少层,引用的都是这两个对象

查看完整回答
反对 回复 2019-02-12
?
www说

TA贡献1775条经验 获得超8个赞

static是静态类变量,只有一份。虽然你是new出来的对象,也是可以调用类变量的。

查看完整回答
反对 回复 2019-02-12
  • 4 回答
  • 0 关注
  • 696 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号