final、finally與finalize三者的區別

天工開物_152368發表於2017-04-03

摘要:final為常量關鍵字,而finally為異常關鍵字,finalize為object自帶方法名。看到這個題目,感覺像是高中題目一樣。出題者用心良苦啊,將這三個聯絡起來,考察java基本功。在實際中finalize這個用得最少,而其他兩個都很熟悉了。但若想流暢的表達三者區別,還需自己好好理一理。
一、final這個關鍵字在Java中代表不可改變的,可用來修飾類,方法,變數。
對class來說,用法如:final class A{}代表類A為終極類,不能被繼承,也就沒有子類之說與介面實現者之說。因此一個類不能既被宣告為 abstract,又被宣告為final。
對method來說,用法如:public final void test(){} 代表此方法不能被重寫。
對variable來說,必須在宣告時賦值,且不能再改變。
先看看這個測試類:

public class Test { 
    int i =1;
    final Test t  = new Test();//Test物件引用變數t不能再指向其他Test物件,但可以通過t來改變此物件中的非常量屬性值。 
    public final void test(){
        final int i = 1;//final修飾的變數必須在宣告時賦值,且不能再改變。
        t.i++;
    }   
}

二、finally關鍵字用在異常處理中,用於處理異常後的清理工作,實際中一般用於關閉檔案流,釋放資源等操作。

System.out.println("----game start----");
try {
    System.out.println("----try----");
    return ;
} catch (NullPointerException e) {
    System.out.println("----catch----");
} finally {
    System.out.println("----finally----");
}       
System.out.println("----game over----");

列印結果:

----game start----
----try----
----finally----

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

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub  
        for(int i=0;i<6;i++){
            System.gc();
            Test t = new Test();            
        }
        System.gc();//若註釋此語句,則只列印0-4,這就是Java垃圾回收機制的一個簡單驗證。
    }
    static int count;
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("-----------finalize-----------"+count++);
    }       
}

列印如下:
———–finalize———–0
———–finalize———–1
———–finalize———–2
———–finalize———–3
———–finalize———–4
———–finalize———–5

相關文章