猿问

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

翻过高山走不出你
浏览 697回答 4
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这样无线循环引用,但是无论写了多少层,引用的都是这两个对象

www说

static是静态类变量,只有一份。虽然你是new出来的对象,也是可以调用类变量的。
随时随地看视频慕课网APP

相关分类

Java
我要回答