一 final
final可以用來修飾:
1. 變數
若修飾基本類型,則表示常量
若修飾參考型別,則表示此變數被賦予的引用是不可變的,但其指向的對象是可變的
若修飾方法的形參,則此形參在方法體內部不可以被賦值
還有一種更貼切的說法,若一個變數或方法參數被final修飾,就表示它只能被賦值一次,但是Java虛擬機器為變數設定預設值不記做一次賦值。
被final修飾的變數必須被初始化,有以下幾種方式:
在定義的時候被初始化;
final修飾的變數可以在初始化塊裡或方法構造器裡被初始化,不可以在靜態初始化快裡被初始化;
final修飾的靜態變數可以在靜態初始化塊裡被初始化,不可以在初始化塊裡被初始化。
這裡順便插一句,static{}語句塊是在類被load時只執行一次,而{}語句塊是在每次執行個體化對象時都執行。
2. 方法
final修飾的方法不可以被重寫,但可以被繼續。
具有private存取權限的方法也可以增加final修飾,但是由於子類無法繼續private方法,因此也無法重寫它。編譯器在處理private方法時,是按照final方法來對待的,這樣可以進步該方法被調用時的效率。不過子類仍然可以定義同父類中的private方法具有同樣結構的方法,但是這並不會產生重寫的效果,而且它們之間也不存在必然聯絡。
3. 類
我們最常用的String類就是final的。由於final類不答應被繼續,編譯器在處理時把它的所有方法都當作final的,因此final類比普通類擁有更高的效率。而由關鍵字abstract定義的抽象類別含有必須由繼續自它的子類重載實現的抽象方法,因此無法同時用final和abstract來修飾同一個類。同樣的道理,final也不能用來修飾介面。final的類的所有方法都不能被重寫,但這並不表示final的類的屬性(變數)值也是不可改變的,要想做到final類的屬性值不可改變,必須給它增加final修飾。
二 finally
它只能用在try/catch語句中,並且附帶著一個語句塊,表示這段語句終極總是被執行。
public final class FinallyTest { public static void main(String[] args) { try { throw new NullPointerException(); } catch (NullPointerException e) { System.out.println("程式拋出了異常"); } finally { System.out.println("執行了finally語句塊"); } } }
運行結果說明了finally的作用:
1. 程式拋出了異常
2. 執行了finally語句塊
留意:return、continue、break無法阻止finally語句的執行,由於對於每個try塊可以引起退出的語句,在bytecode層面上都會有一個指定的位元組碼與finally關聯.,因此,finally肯定會被執行。但System.exit(0)可以。
三 finalize()
由於finalize()屬於Object類,因此所有類都有這個方法,Object的任意子類都可以重寫(override)該方法,在其中開釋系統資源或者做其它的清理工作,如封閉輸進輸出資料流。
原文地址:http://www.csdnjava.com/thread-42983-1-1.html