簡(jiǎn)單談?wù)刯ava中final,finally,finalize的區(qū)別
(1) final:修飾符(關(guān)鍵字),如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖?。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載
(2) finally:在異常處理時(shí)提供 finally 塊來(lái)執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally塊(如果有的話)。
(3) finalize:方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。
上面也許有點(diǎn)含糊不清,我們更加深入的來(lái)探討下
一、性質(zhì)不同
(1)final為關(guān)鍵字;
(2)finalize()為方法;
(3)finally為為區(qū)塊標(biāo)志,用于try語(yǔ)句中;
二、作用
(1)final為用于標(biāo)識(shí)常量的關(guān)鍵字,final標(biāo)識(shí)的關(guān)鍵字存儲(chǔ)在常量池中(在這里final常量的具體用法將在下面進(jìn)行介紹);
(2)finalize()方法在Object中進(jìn)行了定義,用于在對(duì)象“消失”時(shí),由JVM進(jìn)行調(diào)用用于對(duì)對(duì)象進(jìn)行垃圾回收,類似于C++中的析構(gòu)函數(shù);用戶自定義時(shí),用于釋放對(duì)象占用的資源(比如進(jìn)行I/0操作);
(3)finally{}用于標(biāo)識(shí)代碼塊,與try{}進(jìn)行配合,不論try中的代碼執(zhí)行完或沒(méi)有執(zhí)行完(這里指有異常),該代碼塊之中的程序必定會(huì)進(jìn)行;
三、final詳解
1定義變量
1.1 final定義基本類型變量時(shí),要求變量初始化必須在聲明時(shí)或者構(gòu)造函數(shù)中,不能用于其它地方。該關(guān)鍵字定義的常量,除了初始化階段,不能更改常量的值。
1.2 final定義對(duì)象的引用,該引用的初始化與定義常量時(shí)的要求一致;該關(guān)鍵字定義的對(duì)象內(nèi)容可以改變,但是引用指向的地址不能改變;
2定義參數(shù)
如果傳入該參數(shù)定義的變量時(shí),方法不能對(duì)該參數(shù)內(nèi)容進(jìn)行修改(錯(cuò)誤),與定義變量的修改規(guī)則相同;java方法中傳遞基本類型時(shí)是傳值的,java方法對(duì)于對(duì)象的傳遞是傳參的;<歸根結(jié)底,java中方法的傳遞是依靠傳遞“副本”:對(duì)于基本類型,首先建立一個(gè)Copy,并將傳入的值賦值給Copy,然后對(duì)Copy進(jìn)行操作;對(duì)于對(duì)象類型,首先建立一個(gè)引用Copy,并將傳入的對(duì)象引用賦值給Copy>
比如:method(final int test);
有些書上說(shuō),這里final定義參數(shù),尤其是對(duì)象的參數(shù)很有作用,不能在方法內(nèi)對(duì)于對(duì)象的內(nèi)容進(jìn)行改變,這樣的說(shuō)法是錯(cuò)誤的!原來(lái)我也認(rèn)為這樣有些函數(shù)式編程的特點(diǎn),不能對(duì)于對(duì)象的內(nèi)容進(jìn)行修改該,這里依舊可以對(duì)對(duì)象的內(nèi)容進(jìn)行修改。
??定義該參數(shù)有什么用??
String天生就是final類型的!
3定義方法
(1)使用final關(guān)鍵字定義的方法,不能被子類繼承;
(2)允許編譯器將所有對(duì)此方法的調(diào)用轉(zhuǎn)化為inline(行內(nèi))行為,即可以將此方法直接復(fù)制在調(diào)用處,而不是進(jìn)行例行的方法調(diào)用(保存斷點(diǎn)、壓棧),這樣會(huì)使程序的效率升高。但是---------如果過(guò)多的話,這樣會(huì)造成代碼膨脹,反而會(huì)影響效率,所以該方法要慎用。。
4定義類
一個(gè)任何final類無(wú)法被任何人繼承,這也就意味著此類在一個(gè)繼承樹(shù)中是一個(gè)葉子類,并且此類被認(rèn)為是很完美的,不需要進(jìn)行任何修改(總之是不推薦使用)
相關(guān)文章
SpringBoot+OCR?實(shí)現(xiàn)圖片文字識(shí)別
本文主要介紹了SpringBoot+OCR 實(shí)現(xiàn)圖片文字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12swing組件JScrollPane滾動(dòng)條實(shí)例代碼
這篇文章主要介紹了swing組件JScrollPane滾動(dòng)條實(shí)例代碼,分享了兩個(gè)相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知
本文主要介紹了SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07@Bean注解和@Configuration、@Component注解組合使用的區(qū)別
這篇文章主要介紹了@Bean注解和@Configuration、@Component注解組合使用的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java算法之Math.random()隨機(jī)概率玩法實(shí)例演示
最近打算整理排序算法,發(fā)現(xiàn)很有必要準(zhǔn)備一下生成隨機(jī)數(shù)的工具類,下面這篇文章主要給大家介紹了關(guān)于java算法之Math.random()隨機(jī)概率玩法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Java去重排序之Comparable與Comparator的使用及說(shuō)明
這篇文章主要介紹了Java去重排序之Comparable與Comparator的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04