释放对象的引用

一个局部变量的生命周期只存在于其自身类中。以下的例子能够发现,局部变量只能存在于声明该变量的方法中。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

相关文章
相关标签/搜索