Final+Finally+Finalize
Final
final 關(guān)鍵字是一種訪問控制標(biāo)識(shí)符??捎糜谛揎椬兞?、方法、類。
final 變量:(變量、成員或參數(shù))
當(dāng)發(fā)生參數(shù)傳遞或變量被初始化時(shí),final修飾的變量在程序后續(xù)執(zhí)行過程中不能被改變。若變量被定義為final,并且未被初始化時(shí),必須先經(jīng)由初始化塊或構(gòu)造器將其初始化后才能使用。
final 方法:
被定義為final的方法不能被子類重寫。
final 類:
當(dāng)類被定義為final時(shí),該類將不能派生子類。類被定義為final時(shí),將使得其中的成員和方法被隱示定義為final。
Finally
用于顯示回收try塊里打開的物理資源(例如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件等等)。
<span style="background:yellow">Java的垃圾回收機(jī)制不會(huì)回收任何物理資源,只能回收堆內(nèi)存中對(duì)象所占用的內(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)其中之一,也可同時(shí)出現(xiàn)
- 可以有多個(gè)catch塊,捕獲父類異常的catch塊必須位于捕獲子類異常的后面
- 不能只有try塊,catch塊和finally塊都沒有
- 多個(gè)catch塊必須位于try塊之后,finally塊必須位于所有的catch塊之后
- 不要在finally塊中使用return或throw等導(dǎo)致方法終止的語句,一旦如此。將會(huì)導(dǎo)致try塊、catch塊中的return、throw語句失效
不管try塊中的代碼是否出現(xiàn)異常,也不管哪一個(gè)catch塊被執(zhí)行,甚至在try塊或catch塊中執(zhí)行了return語句,finally塊總會(huì)被執(zhí)行。不過若在try塊或catch塊中調(diào)用了退出虛擬機(jī)的方法,則finally塊中的代碼不會(huì)執(zhí)行。
Finalize
在垃圾回收機(jī)制回收某個(gè)對(duì)象所占用的內(nèi)存之前,通常要求程序調(diào)用適當(dāng)?shù)姆椒▉砬謇碣Y源,在沒有明確指定清理資源的情況下,Java提供了默認(rèn)機(jī)制來清理該對(duì)象的資源,這個(gè)機(jī)制就是finallize()方法。
finalize()方法是定義在Object類中的實(shí)例方法。
protected void finalize() throws Throwable
當(dāng)finalize()方法返回后,對(duì)象消失,垃圾回收機(jī)制開始執(zhí)行。方法原型中的throws Throwable表示該方法可拋出任何類型的異常。
若程序終止之前沒有進(jìn)行垃圾回收,則不會(huì)調(diào)用失去引用對(duì)象的finalize()方法來清理資源。 垃圾回收機(jī)制何時(shí)調(diào)用對(duì)象的finalize()方法是完全透明的。
下面介紹一下Java中引用的類型:
對(duì)象的軟、弱和虛引用
-
強(qiáng)引用(StrongReference)
Java程序中最常見的應(yīng)用方式。程序創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象賦給一個(gè)引用變量,程序通過該引用變量來操作實(shí)際的對(duì)象。當(dāng)一個(gè)或一個(gè)以上的引用變量所引用時(shí),它處于可達(dá)狀態(tài),不可能被垃圾回收機(jī)制回收。
-
軟引用(SoftReference)
通過SoftReference類實(shí)現(xiàn)。當(dāng)一個(gè)對(duì)象只有軟引用時(shí),它可能會(huì)被垃圾回收機(jī)制回收。當(dāng)系統(tǒng)內(nèi)存空間足夠時(shí),被軟引用的對(duì)象不會(huì)被系統(tǒng)回收,程序也可使用該對(duì)象;當(dāng)空間不足時(shí),系統(tǒng)可能會(huì)回收它。
-
弱引用(WeakReference)
通過WeakReference類實(shí)現(xiàn)。弱引用和軟引用很相像,但弱引用的引用級(jí)別更低。當(dāng)系統(tǒng)垃圾回收機(jī)制運(yùn)行時(shí),不管系統(tǒng)內(nèi)存是否足夠,總會(huì)回收被該引用引用的對(duì)象。
-
虛引用(PhantomReference)
通過PhantomReference類實(shí)現(xiàn)。虛引用類似于完全沒有引用。虛引用對(duì)對(duì)象本身沒有太大的影響,對(duì)象甚至感覺不到虛引用的存在。虛引用主要用于跟蹤對(duì)象被垃圾回收的狀態(tài),虛引用必須和引用隊(duì)列(ReferenceQueue)聯(lián)合使用。
上述三個(gè)引用都包含了一個(gè)get()方法,用于獲取被它們引用的對(duì)象。
引用隊(duì)列(ReferenceQueue):
用于保存被回收的對(duì)象的引用。
- 當(dāng)聯(lián)合使用軟引用、弱引用和引用隊(duì)列時(shí),系統(tǒng)在回收被引用的對(duì)象之后,將把被回收的對(duì)象對(duì)應(yīng)的引用添加到關(guān)聯(lián)的引用隊(duì)列之中。
- 虛引用在對(duì)象被釋放之前,將把它對(duì)應(yīng)的虛引用添加到它關(guān)聯(lián)的引用隊(duì)列中,使得可以在對(duì)象被回收之前采取行動(dòng)。