1. 程式人生 > >final finally finalize的使用區別

final finally finalize的使用區別

final

修飾符(關鍵字)如果一個類被宣告為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被宣告為 abstract的,又被宣告為final的。將變數或方法宣告為final,可以保證它們在使用中不被改變。被宣告為final的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改。被宣告為final的方法也同樣只能使用,不能過載。 可修飾成員變數、方法引數、方法、類,具體的使用效果及使用注意事項這裡暫不提供。

finally

異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。一般異常處理塊需要。

finalize

方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的。 

Java中所有類都從Object類中繼承finalize()方法。

當垃圾回收器(garbage colector)決定回收某物件時,就會執行該物件的finalize()方法。值得C++程式設計師注意的是,finalize()方法並不能等同與解構函式。Java中是沒有解構函式的。C++的解構函式是在物件消亡時執行的。由於C++沒有垃圾回收,物件空間手動回收,所以一旦物件用不到時,程式設計師就應當把它delete()掉。所以解構函式中經常做一些檔案儲存之類的收尾工作。但是在Java中很不幸,如果記憶體總是充足的,那麼垃圾回收可能永遠不會進行,也就是說filalize()可能永遠不被執行,顯然指望它做收尾工作是靠不住的。

那麼finalize()究竟是做什麼的呢?它最主要的用途是回收特殊渠道申請的記憶體。Java程式有垃圾回收器,所以一般情況下記憶體問題不用程式設計師操心。但有一種JNI(Java Native Interface)呼叫non-Java程式(C或C++),finalize()的工作就是回收這部分的記憶體。