1. 程式人生 > >一、基礎篇--1.1Java基礎-final, finally, finalize 的區別

一、基礎篇--1.1Java基礎-final, finally, finalize 的區別

final, finally, finalize

首先,這三個關鍵字沒什麼關聯,只是放在一起比較像,用法用處完全不同。

final:

  final關鍵字可以用來修飾類、方法、變數(成員變數和區域性變數),final用的多,下面詳細介紹下

  1.1 final 修飾類

    final修飾類,表明這個類不能被繼承,同時該類內的所有方法都被隱式定義為final。

  1.2 final 修飾方法

    final 修飾方法,該方法不可以被繼承,不可以被重寫。因此要注意,如果子類定義相同方法名和引數的函式,不是重寫父類方法,是重新定義了一個新方法。

  1.3 final 修飾變數

    final修飾變數,表示只能被賦值一次,賦值後其值不再改變。

    當修飾基本資料型別時,基本資料型別的值初始化後就不會再發生變化。

    當修飾引用型別時,初始化後就不能再指向其他物件了,但是物件的值是可以變化的。引用的值本質是一個地址,因此只要地址不變,就不衝突。

    final修飾一個成員變數,必須要顯式初始化。一種是宣告變數時候初始化,一種是宣告變數時不初始化,建構函式中對變數初始化。

finally :

  finally用於異常處理,只能用在try/catch語句中。

  關於finally要注意兩點:

    1、finally不一定會執行

      有兩種不會執行:a、在執行try/catch之前異常跳出。b、系統強制退出,例如:System.exit(0);

    2、finally中包含return的易錯點!!在Java語言的異常處理中,finally塊的作用就是為了保證無論出現什麼情況,finally塊裡的程式碼一定會被執行。

    由於程式執行return就意味著結束對當前函式的呼叫並跳出這個函式體,因此任何語句要執行都只能在return前執行(除非碰到exit函式),因此finally塊裡的程式碼也是在return之前執行的

    例如:    

    public
static void main(String[] args) { int result = test(); System.out.println(result); } public static int test(){ try { return 1; } catch (Exception e) { return 0; }finally{ System.out.println("finally"); return 2; } }

 

      執行結果:

    

    可以知道,finally塊中有return語句時,會覆蓋函式中的return。

    由於java中值傳遞和引用傳遞的不同,因此,對基本型別的資料,在finally塊中改變return的值對返回值沒有任何影響,而對引用型別的資料會有影響

    例子:   

public static void main(String[] args) {
        System.out.println(test());
        System.out.println( testStr());
    }
    private static int test(){
        int i = -1;
        try {
            i= 1;
            return i;
        } catch (Exception e) {
            return i;
        }finally{
            i=2;
            System.out.println("finally");
        }
    }
    private static StringBuilder  testStr(){
        StringBuilder  str = new StringBuilder("hello");
        try {
            return str;
        } catch (Exception e) {
            return null;
        }finally{
            str.append("world");
            System.out.println("finally");
        }
    }

    執行結果:

    

finalize:

  finalize()是在java.lang.Object裡定義的,也就是說每一個物件都有這麼個方法。這個方法在gc啟動,該物件被回收的時候被呼叫。不需要程式設計師自己手動呼叫的。只瞭解,不推薦使用。