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)該方法,在其中開釋系統資源或者做其它的清理工作,如封閉輸進輸出流。