天天看點

Java中final、finally、finalize的定義和差別

這三兄弟内容上并沒有交集,但是因為長的像,是以常常被放在一起比較。。。。

一:final

final是一個關鍵字,用來聲明類、變量和方法。final具有終止的含義。

當用final修飾一個類時,這個類就無法再被繼承了,也就是說這個類就到此為止了,它不會再有子類了。

當用final修飾一個變量時,那麼這個變量就變成了一個常量,不允許再被重新指派,是以一個final修飾的變量通常在聲明時就給它指派。

當用final修飾一個方法時,表示這個方法不可被重寫,隻能夠被使用。

二:finally

finally通常是搭配Try-Catch使用的,Try-Catch是異常處理機制,首先執行Try裡面的代碼,如果發生異常就會執行Catch裡面的代碼,而最後都會執行finally裡面的代碼,是以可以在finally裡面進行一些資源釋放操作。

三:finalize

finalize是Object中的一個方法,是以每個對象都會有這個方法,對象可以選擇重寫該方法。finalize()方法主要在進行垃圾回收時會被調用到,具體如下:

(1)當一個對象不再被引用,就會被第一次标記,此時會進行一次判斷,如果該對象沒有重寫finalize()方法或者finalize()方法已經被調用過一次了,對象就打上死亡标記了,等待記憶體被回收。

(2)如果該對象重寫了finalize()方法并且還沒有被調用過,這個對象就會被放到一個名為F-Queue的隊列中,然後虛拟機會建立一個優先級低的Finalizer線程去執行該隊列中對象的finalize()方法。

(3)GC會對F-Queue隊列内的對象進行第二次标記,如果在執行finalize()方法期間該對象又被引用了,那麼該對象就成功複活了,這一次不會被回收,而其它沒有複活的對象則會被第二次标記進而真正死亡了,等待記憶體被回收。

(4)由于finalize()方法最多隻能被調用一次,是以假如一個對象被回收時第一次調用finalize()方法成功複活,那麼第二次被回收時就不會再調用finalize()方法了,而是直接死亡等待被回收。

有些人說可以在finalize()方法中做一些釋放資源之類的操作,但是這些操作完全可以放到finally中去執行,而且finalize()方法運作消耗的資源很多,是以通常沒必要使用finalize()方法。