Java中final、finally 和 finalize

一   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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章