释放对象的引用

一个局部变量的生命周期只存在于其自身类中。如下的例子可以发现,局部变量只能存在于声明该变量的方法中。

public class TestLifeOne {
    public void  read() {
        int s=42;        //s只能限于read()中使用,别处无法使用
        sleep();
    }
    public void sleep() {
        s=7;    //s在此处无法使用
    }

}

对于实例变量,其寿命与对象的寿命相同。对象未“死”,实例变量也未“死”。

public class TestLifeOne {
    
    int size;
    
    public void sleep(int s) {
        size=s;     //s会在方法结束时消失,但是size在类TestLifeOne中处处可以使用。
    }

}

引用变量如果活着,那么对象也会活着,当对对象的引用死了,那么该对象也会从堆上被踢开,变成垃圾被垃圾收集器(GC)所回收。

有三种方法释放对象的引用,当最后一个引用消失时,对象就会变成可回收的。

 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还在引用该对象

这个要想通其实画一个对象引用的箭头图就能明白了。

posted @ 2019-03-04 11:06  大大木瓜  阅读(792)  评论(0编辑  收藏  举报