在java中final、finally、finalize三者在寫法上很相近,可是實際含義和做用倒是相差甚遠。本文主要是來深層的研究下這三者的用法以及之間的區別java
1.finaljvm
屬性:java中的關鍵字,修飾符spa
做用:用於修飾類、成員方法、變量(成員變量、局部變量)3d
用法:若是類被聲明爲final,那麼該類就不能再派生出新的子類,也不能看成父類被子類繼承。一個類不能同時被聲明爲抽象類(absrtact修飾)和final的類;若是成員方法被聲明final,那麼該方法只能使用,不能重載;若是變量(成員變量、局部變量)被聲明爲final,那麼必須在聲明時給定初始化的值,在後面的引用中只能讀取,不可修改值。對象
注意:1.類被聲明爲final,類中的全部成員方法都會被隱式地指定爲final方法; 2. final成員變量必須在聲明的時候初始化或者在構造器中初始化,不然編譯時會報錯; 3.在匿名類(內部類)中全部變量都必須是final變量; 4.在接口中聲明的全部變量自己是final的; 5.若是基本數據類型的變量被聲明爲final,則其數值一旦在初始化以後便不能更改blog
若是引用類型的變量被聲明爲final,則在對其初始化以後便不能再讓其指向另外一個對象,但該對象的內容是能夠改變的繼承
6.當final變量是基本數據類型以及String類型時,在編譯期間是知道它的確切值,那麼編譯器會把它當作編譯期常量,在用到該final變量的地方,至關於直接訪問的這個常量接口
只有在編譯期間能肯定final變量值的時候纔會被當編譯常量,如下是編譯時不知道肯定值的內存
2.finally資源
屬性:異常處理時的finally塊
做用: try { 正常邏輯 } catch(Exception e) { 異常邏輯 } finally{ 必定會被執行的邏輯 }
用法:異常處理(try catch)時finally塊不管有沒有異常發生,finally塊的代碼必定會被執行,因此在程序中有須要不管發生什麼都必須執行的代碼,就能夠放在finally塊中,最多見流關閉等釋放資源的操做
注意:1.finally代碼塊不管有沒有異常發生,finally塊的代碼必定會被執行; 2.即便try裏包含continue、break、return語句,try塊結束後,finally塊也會執行; 3.finally中最好不要包含return,不然程序會提早退出,返回值不是try或catch中保存的返回值
3.finalize
屬性:方法名,Object中的方法
做用:finalize()方法是在垃圾收集器刪除對象以前對這個對象調用
用法:Java中使用finalize()方法在垃圾收集器將對象從內存中清除出去以前(GC以前)作必要的清理內存的工做。這個方法是在垃圾收集器確認一個對象沒有被引用時對這個對象調用的。它在Object類中定義的,全部的類都繼承了它。子類覆蓋finalize()方法已整理系統資源或者執行其餘清理工做。finalize()方法是在垃圾收集器刪除對象以前對這個對象調用的
注意:1.垃圾回收器要回收對象的時候,首先要調用這個類的finalize方法
2.程序退出時爲每一個對象調用一次finalize方法
3.當某個對象被系統收集爲無用信息的時候,finalize()將被自動調用,可是jvm不保證finalize()必定被調用
4.finalize()方法被關鍵字protected修飾是防止在該類以外定義的代碼訪問finalize()標識符
5.finalize()方法的主要用途是釋放一些其餘作法開闢的內存空間,以及作一些清理工做
6. 一旦垃圾回收器GC準備好釋放對象佔用的存儲空間,首先會去調用finalize()方法進行一些必要的清理工做。只有到下一次再進行垃圾回收動做的時候,纔會真正釋放這個對象所佔用的內存空間
7.finalize()如今已經不推薦使用了,java9已經設置爲deprecated了