Final+Finally+Finalize
Final
final 關(guān)鍵字是一種訪問控制標識符践宴∫常可用于修飾變量、方法运授、類。
final 變量:(變量柒室、成員或參數(shù))
當(dāng)發(fā)生參數(shù)傳遞或變量被初始化時逗宜,final修飾的變量在程序后續(xù)執(zhí)行過程中不能被改變纺讲。若變量被定義為final,并且未被初始化時熬甚,必須先經(jīng)由初始化塊或構(gòu)造器將其初始化后才能使用。
final 方法:
被定義為final的方法不能被子類重寫复局。
final 類:
當(dāng)類被定義為final時粟判,該類將不能派生子類档礁。類被定義為final時,將使得其中的成員和方法被隱示定義為final。
Finally
用于顯示回收try塊里打開的物理資源(例如數(shù)據(jù)庫連接惨险、網(wǎng)絡(luò)連接和磁盤文件等等)脊髓。
<span style="background:yellow">Java的垃圾回收機制不會回收任何物理資源,只能回收堆內(nèi)存中對象所占用的內(nèi)存恭朗。</span>
完整的Java異常處理語法如下:
try
{
...
}
catch(SubException e)
{
...
}
catch(SubException2 e)
...
finally
{
//資源回收
...
}
異常處理語法結(jié)構(gòu)規(guī)則:
- 只有try塊是必需的依疼,如果沒有try塊,則不能有后面的catch塊和finally塊
- catch塊和finally塊都是可選的膀值,但catch塊和finally塊至少出現(xiàn)其中之一沧踏,也可同時出現(xiàn)
- 可以有多個catch塊巾钉,捕獲父類異常的catch塊必須位于捕獲子類異常的后面
- 不能只有try塊,catch塊和finally塊都沒有
- 多個catch塊必須位于try塊之后睛琳,finally塊必須位于所有的catch塊之后
- 不要在finally塊中使用return或throw等導(dǎo)致方法終止的語句师骗,一旦如此。將會導(dǎo)致try塊寒屯、catch塊中的return、throw語句失效
不管try塊中的代碼是否出現(xiàn)異常寡夹,也不管哪一個catch塊被執(zhí)行菩掏,甚至在try塊或catch塊中執(zhí)行了return語句昵济,finally塊總會被執(zhí)行野揪。不過若在try塊或catch塊中調(diào)用了退出虛擬機的方法,則finally塊中的代碼不會執(zhí)行斯稳。
Finalize
在垃圾回收機制回收某個對象所占用的內(nèi)存之前挣惰,通常要求程序調(diào)用適當(dāng)?shù)姆椒▉砬謇碣Y源,在沒有明確指定清理資源的情況下憎茂,Java提供了默認機制來清理該對象的資源唇辨,這個機制就是finallize()
方法能耻。
finalize()方法是定義在Object類中的實例方法亡驰。
protected void finalize() throws Throwable
當(dāng)finalize()方法返回后,對象消失戒职,垃圾回收機制開始執(zhí)行洪燥。方法原型中的throws Throwable
表示該方法可拋出任何類型的異常乳乌。
若程序終止之前沒有進行垃圾回收,則不會調(diào)用失去引用對象的finalize()方法來清理資源汉操。 垃圾回收機制何時調(diào)用對象的finalize()方法是完全透明的磷瘤。
下面介紹一下Java中引用的類型:
對象的軟、弱和虛引用
-
強引用(StrongReference)
Java程序中最常見的應(yīng)用方式针炉。程序創(chuàng)建一個對象扳抽,并把這個對象賦給一個引用變量绩社,程序通過該引用變量來操作實際的對象愉耙。當(dāng)一個或一個以上的引用變量所引用時朴沿,它處于可達狀態(tài)败砂,不可能被垃圾回收機制回收。
-
軟引用(SoftReference)
通過SoftReference類實現(xiàn)坚芜。當(dāng)一個對象只有軟引用時斜姥,它可能會被垃圾回收機制回收。當(dāng)系統(tǒng)內(nèi)存空間足夠時缚忧,被軟引用的對象不會被系統(tǒng)回收闪水,程序也可使用該對象;當(dāng)空間不足時蒙具,系統(tǒng)可能會回收它禁筏。
-
弱引用(WeakReference)
通過WeakReference類實現(xiàn)融师。弱引用和軟引用很相像,但弱引用的引用級別更低旱爆。當(dāng)系統(tǒng)垃圾回收機制運行時怀伦,不管系統(tǒng)內(nèi)存是否足夠房待,總會回收被該引用引用的對象驼抹。
-
虛引用(PhantomReference)
通過PhantomReference類實現(xiàn)拜鹤。虛引用類似于完全沒有引用敏簿。虛引用對對象本身沒有太大的影響,對象甚至感覺不到虛引用的存在温数。虛引用主要用于跟蹤對象被垃圾回收的狀態(tài)蜻势,虛引用必須和引用隊列(ReferenceQueue)聯(lián)合使用握玛。
上述三個引用都包含了一個get()方法败许,用于獲取被它們引用的對象淑蔚。
引用隊列(ReferenceQueue):
用于保存被回收的對象的引用刹衫。
- 當(dāng)聯(lián)合使用軟引用、弱引用和引用隊列時带迟,系統(tǒng)在回收被引用的對象之后音羞,將把被回收的對象對應(yīng)的引用添加到關(guān)聯(lián)的引用隊列之中。
- 虛引用在對象被釋放之前仓犬,將把它對應(yīng)的虛引用添加到它關(guān)聯(lián)的引用隊列中嗅绰,使得可以在對象被回收之前采取行動。