釋放對象的引用

一個局部變量的生命週期只存在於其自身類中。以下的例子能夠發現,局部變量只能存在於聲明該變量的方法中。spa

public class TestLifeOne {
    public void  read() {
        int s=42;        //s只能限於read()中使用,別處沒法使用
        sleep();
    }
    public void sleep() {
        s=7;    //s在此處沒法使用
    }

}

對於實例變量,其壽命與對象的壽命相同。對象未「死」,實例變量也未「死」。code

public class TestLifeOne {
    
    int size;
    
    public void sleep(int s) {
        size=s;     //s會在方法結束時消失,可是size在類TestLifeOne中到處能夠使用。
    }

}

引用變量若是活着,那麼對象也會活着,當對對象的引用死了,那麼該對象也會從堆上被踢開,變成垃圾被垃圾收集器(GC)所回收。對象

有三種方法釋放對象的引用,當最後一個引用消失時,對象就會變成可回收的。blog

 1     void go() {        //引用永久性地離開它的範圍
 2         Life z=new Life();  //z會在方法結束時消失
 3     }
 4     
 5     //引用z被賦值到其餘對象上時
 6     Life z=new Life();    
 7     z=new Life();        //此處,第一個Life對象會在z被賦值到別處時消失
 8     
 9     //直接將引用z設定爲null
10     Life z=new Life();
11     z=null;                //此處,第一個Life對象在z被賦值爲null時消失

 在以下代碼中插入一條代碼,會有哪些是使某一個額外對象被認爲是能夠垃圾回收的?生命週期

    GC gc1;
    GC gc2=new GC();
    GC gc3=new GC();
    GC gc4=gc3;
    gc1=new GC();
    
    //在上述代碼下加入如下一行代碼,會使一個額外的對象被認爲是可回收的垃圾嗎?
    gc2=null;          //會,gc2是惟一引用,所以其對象會被回收
    gc1=null;        //同上
    gc4=null;        //不會,還有gc3引用gc4的對象,所以不會被回收
    gc3=gc2;        //不會,還有gc4引用gc3的對象,所以不會被回收
    gc1=gc4;        //會,從新給對象引用賦值
    gc3=null;        //不會,gc4還在引用該對象

這個要想通其實畫一個對象引用的箭頭圖就能明白了。class

相關文章
相關標籤/搜索