Final、Finally和Finalize

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ì)象的軟、弱和虛引用

  1. 強(qiáng)引用(StrongReference)

    Java程序中最常見的應(yīng)用方式。程序創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象賦給一個(gè)引用變量,程序通過該引用變量來操作實(shí)際的對(duì)象。當(dāng)一個(gè)或一個(gè)以上的引用變量所引用時(shí),它處于可達(dá)狀態(tài),不可能被垃圾回收機(jī)制回收。

  2. 軟引用(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ì)回收它。

  3. 弱引用(WeakReference)

    通過WeakReference類實(shí)現(xiàn)。弱引用和軟引用很相像,但弱引用的引用級(jí)別更低。當(dāng)系統(tǒng)垃圾回收機(jī)制運(yùn)行時(shí),不管系統(tǒng)內(nèi)存是否足夠,總會(huì)回收被該引用引用的對(duì)象。

  4. 虛引用(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)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容