題目:談?wù)?final、finally蝴乔、finalize的區(qū)別记餐?
解析:如題,如果要知道他們之間的區(qū)別薇正,那么我們必須要知道它們每一個是什么意思片酝。
1 . final
final 可以用于控制成員、方法挖腰,或者是一個類是否可以被覆寫或繼承等功能雕沿,這些特點 final 在 Java 中擁有一個不可或缺的地位,也是學(xué)習(xí) Java時必須要知道和掌握的關(guān)鍵字之一曙聂。
(1)final 成員
當(dāng)在類中定義變量時晦炊,若在其前面加上 final 關(guān)鍵字,那就是說,這個變量一旦被初始化断国,便是不可改變的贤姆。
例如:final String str = "abc";
final int a = 8;
這里的不可改變的意思對基本數(shù)據(jù)類型(如a的值)來說是其值不可變,而對于對象變量(如引用 str )來說是引用不可變稳衬。其初始化可以在兩個地方霞捡,一是其定義處,二是在構(gòu)造函數(shù)中薄疚,二者只能選其一碧信。
還有一種用法是定義方法中的參數(shù)為 final 關(guān)鍵字。對于基本數(shù)據(jù)類型的變量街夭,這樣做并沒有什么實際的意義砰碴,因為基本類型的變量在調(diào)用方法時是傳值的,也就是說板丽,我可以在方法中更改這個參數(shù)變量而不會影響到調(diào)用語句呈枉,然而對于對象變量,卻顯得很實用埃碱,因為對象變量在傳遞時是傳遞其引用的猖辫,這樣,我在方法中對對象變量的修改也會影響到調(diào)用語句中的對象變量砚殿。當(dāng)你在方法中不需要改變作為參數(shù)的對象變量時啃憎,明確使用 final 進行聲明,會防止你無意的修改而影響到調(diào)用方法似炎。
(2)final 方法
將方法聲明為 final 有兩個原因辛萍。第一就是說明應(yīng)知道這個方法提供的功能滿足要求,不需要進行擴展名党,并且也不允許任何從此類繼承的類來覆寫這個方法叹阔,但是仍然可以繼承這個方法挠轴,也就是說传睹,可以直接使用。第二就是允許編譯器將所有對此方法的調(diào)用轉(zhuǎn)化為 inline(行內(nèi))調(diào)用機制岸晦,例如欧啤,保存斷點、壓棧等(启上?)邢隧,這樣可能會使程序的效率有所有提高。然而冈在,當(dāng)方法的主題非常龐大的時候倒慧,或者在多處調(diào)用此方法時,調(diào)用主體代碼便會迅速膨脹,可能反而影響效率纫谅,所以要慎用 final 進行方法定義炫贤。
(3)final 類
當(dāng)將 final 用于類時,就需要仔細(xì)考慮付秕,因為一個 final 類是無法被任何人繼承的兰珍,那也就以為著此類在一個繼承樹中是一個葉子類,并且此類的設(shè)計已被人很完美询吴,不需要進行修改或擴展掠河。 對于 final 類中成員,可以定義其為 final猛计,也可以不是 final唠摹。 而對于方法,由于所屬的類為 final 的關(guān)系奉瘤,自然也就成了 final 型的跃闹。也可以明確的給 final 類中的方法加上一個 final ,但這個顯然是沒有意義的毛好。
2. finally
finally 關(guān)鍵字是對 Java 異常處理模型的最佳補充望艺。finally 結(jié)構(gòu)使代碼總會執(zhí)行,而不管有無異常發(fā)生肌访。使用 finally 可以維護對象內(nèi)部的狀態(tài)找默,并可以清理非內(nèi)存資源。如果沒有 finally 吼驶,我們的代碼就會很費解惩激。
3. finalize
根據(jù) Java 語言規(guī)范,JVM保證調(diào)用 finalize函數(shù)之前蟹演,這個對象是不可達的风钻,但是JVM 不保證這個函數(shù)一定會被調(diào)用。另外酒请,規(guī)范還保證 finalize 函數(shù)最多運行一次骡技。
通常,finalize 用于一些不容易控制羞反,并且非常重要的資源的釋放布朦,例如,一些 I/O 的操作昼窗、數(shù)據(jù)的連接是趴。這些資源的釋放對整個應(yīng)用程序是非常關(guān)鍵的。在這種情況下澄惊,程序員應(yīng)該可以通過程序本身的管理(包括釋放)這些資源為主唆途,以 finalize 函數(shù)釋放資源方式為輔富雅,形成一種雙保險的管理機制,而不是應(yīng)該僅僅依靠 finalize 來釋放資源肛搬。
答案
1. final 修飾符 (關(guān)鍵字)
如果一個類被聲明為 final 吹榴, 意味著它不能在派生處新的子類,不能作為父類被繼承滚婉。因此图筹,一個類既不能被聲明為 abstract ,又被聲明為 final 让腹。將變量或者方法聲明為 final远剩,可以保證它們在使用中不被改變。其初始化可以在兩個地方:一個是其定義處骇窍,也就是說瓜晤,在 final 變量定義時直接給其賦值;而是在構(gòu)造函數(shù)中腹纳。這兩個地方只能選其一痢掠,要么在定義時給值,要么在構(gòu)造函數(shù)中給值嘲恍,不能同時既在定義時給了值足画,又在構(gòu)造構(gòu)造函數(shù)中給另外的值,而在以后的引用中只能讀取佃牛,不可修改淹辞。被聲明為 final 的方法也同樣只能使用,不能重寫(override)俘侠。
2. finally
在異常處理時提供 finally 塊來執(zhí)行任何清楚操作象缀。如果跑出一個異常,那么相匹配的 catch 自居就會執(zhí)行爷速,然后控制就會進入 finally 塊 (如果有的話)央星。
3.finalize
finalize 是方法名。 Java技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存清除出去前做必要的清理工作惫东。這個方法有垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的莉给。它是在Object 類中定義的,因此凿蒜,所有的類都繼承類它禁谦。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。 finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的废封。