释放对象的引用
一个局部变量的生命周期只存在于其自身类中。如下的例子可以发现,局部变量只能存在于声明该变量的方法中。
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还在引用该对象
这个要想通其实画一个对象引用的箭头图就能明白了。