一、基礎篇--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之前執行的。
例如:
publicstatic 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啟動,該物件被回收的時候被呼叫。不需要程式設計師自己手動呼叫的。只瞭解,不推薦使用。