Java 一个死循环问题

看第一段代码

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();可以无限引用,但是有没有形成死循环,这是为什么?有人可以从内存角度分析一下上述第二种代码吗?

阅读 3.8k
4 个回答

第一段代码new Test()时候会执行public Test test = new Test(); ,之后继续进入new Test(),造成死循环、无限实例化,最后内存溢出;
第二段代码public static Test test = new Test(); 是在类加载的时候执行,每次new Test()时候不会重复执行,所以不会重复实例化变量

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题