鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ Java 一個死循環(huán)問題

Java 一個死循環(huán)問題

看第一段代碼

public class Test {

    public Test test = new Test();

    public void say() {
        System.out.println("hello world!");
    }

    public static void main(String[] args) {
        new Test();
    }
}

上邊這段代碼會造成死循環(huán)并導(dǎo)致內(nèi)存溢出,接下來看第二段代碼

public class Test {

    public static Test test = new Test();

    public void say() {
        System.out.println("hello world!");
    }

    public static void main(String[] args) { 
        // 可以無限引用下去,但不會形成死循環(huán)
        new Test().test.test.test.test.test.say();
    }
}

上述第二段代碼中,new Test().test.test.test.test.test.say();可以無限引用,但是有沒有形成死循環(huán),這是為什么?有人可以從內(nèi)存角度分析一下上述第二種代碼嗎?

回答
編輯回答
離觴

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。不管你調(diào)用多少次.test都是指向一個堆地址。

2017年6月8日 11:19
編輯回答
孤毒

static是靜態(tài)類變量,只有一份。雖然你是new出來的對象,也是可以調(diào)用類變量的。

2017年11月28日 13:12
編輯回答
半心人

第一個段代碼是在無線創(chuàng)建對象,每次都會消耗內(nèi)存創(chuàng)建新對象

第二段代碼類似兩個對象的互相引用,沒有新對象產(chǎn)生,沒有內(nèi)存消耗
A a = new A();
B b = new B();
a.b = b;
b.a = a;
這樣就能a.b.a.b.a.b這樣無線循環(huán)引用,但是無論寫了多少層,引用的都是這兩個對象

2018年5月1日 12:39
編輯回答
蔚藍色

第一段代碼new Test()時候會執(zhí)行public Test test = new Test(); ,之后繼續(xù)進入new Test(),造成死循環(huán)、無限實例化,最后內(nèi)存溢出;
第二段代碼public static Test test = new Test(); 是在類加載的時候執(zhí)行,每次new Test()時候不會重復(fù)執(zhí)行,所以不會重復(fù)實例化變量

2017年8月27日 06:50