一個局部變量的生命週期只存在於其自身類中。以下的例子能夠發現,局部變量只能存在於聲明該變量的方法中。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