随笔② Java中的关键字 --- final关键字
一:final關(guān)鍵字
① final變量:凡是對(duì)成員變量或者本地變量(在方法中的或者代碼塊中的變量稱(chēng)為本地變量)聲明為final的都叫作final變量。final變量經(jīng)常和static關(guān)鍵字一起使用,作為常量。final變量是只讀的。
② final方法:方法前面加上final關(guān)鍵字,代表這個(gè)方法不可以被子類(lèi)的方法重寫(xiě)。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了,子類(lèi)中不需要改變的話,你可以聲明此方法為final。final方法比非final方法要快,因?yàn)樵诰幾g的時(shí)候已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定。
③ final類(lèi):使用final來(lái)修飾的類(lèi)叫作final類(lèi)。final類(lèi)通常功能是完整的,它們不能被繼承。Java中有許多類(lèi)是final的,譬如String, Interger以及其他包裝類(lèi)。
④ final關(guān)鍵字的好處:
- final關(guān)鍵字提高了性能。JVM和Java應(yīng)用都會(huì)緩存final變量。
- final變量可以安全的在多線程環(huán)境下進(jìn)行共享,而不需要額外的同步開(kāi)銷(xiāo)。
- 使用final關(guān)鍵字,JVM會(huì)對(duì)方法、變量及類(lèi)進(jìn)行優(yōu)化。
⑤ 不可變類(lèi):創(chuàng)建不可變類(lèi)要使用final關(guān)鍵字。不可變類(lèi)是指它的對(duì)象一旦被創(chuàng)建了就不能被更改了。String是不可變類(lèi)的代表。不可變類(lèi)有很多好處,譬如它們的對(duì)象是只讀的,可以在多線程環(huán)境下安全的共享,不用額外的同步開(kāi)銷(xiāo)等等。
⑥ 關(guān)于final關(guān)鍵字需要注意的點(diǎn):
- final關(guān)鍵字可以用于成員變量、本地變量、方法以及類(lèi)。
- final成員變量必須在聲明的時(shí)候初始化或者在構(gòu)造器中初始化,否則就會(huì)報(bào)編譯錯(cuò)誤。
- 不能夠?qū)inal變量再次賦值。引用類(lèi)型的成員變量的引用不可以改變,但是內(nèi)容可以改變。
- 本地變量必須在聲明時(shí)賦值。
- 在匿名類(lèi)中所有變量都必須是final變量。
- 在匿名類(lèi)中所有變量都必須是final變量。
- final類(lèi)不能被繼承。
- final關(guān)鍵字不同于finally關(guān)鍵字,后者用于異常處理。
- final關(guān)鍵字容易與finalize()方法搞混,后者是Object類(lèi)中定義的方法,是在垃圾回收之前被JVM調(diào)用的方法。
- 接口中聲明的所有變量本身是final的。
- final和abstract關(guān)鍵字是相反的,不能同時(shí)使用。
- final方法在編譯階段綁定,稱(chēng)為靜態(tài)綁定(static binding)。
- 沒(méi)有在聲明時(shí)初始化的final變量稱(chēng)為空白final變量(blank final variable),它們必須在構(gòu)造器中初始化,或者調(diào)用this()初始化。不那么做的話,編譯器會(huì)報(bào)錯(cuò)"final變量(變量名)需要進(jìn)行初始化"。
- 對(duì)于集合對(duì)象聲明為final指的是引用不能更改,但是你可以向其中增加,刪除或者改變內(nèi)容。
二: final、finally和finalize的區(qū)別
?
1.final
?
如果一個(gè)類(lèi)被聲明為final,意味著它不能再派生出新的子類(lèi),不能作為父類(lèi)被繼承。因此一個(gè)類(lèi)不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖儭1宦暶鳛閒inal的變量必須在new一個(gè)對(duì)象時(shí)初始化(即只能在聲明變量或構(gòu)造器或代碼塊內(nèi)初始化),而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能覆蓋(重寫(xiě))。
?
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 類(lèi)中定義的,因此所有的類(lèi)都繼承了它。子類(lèi)覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。注意:finalize不一定被jvm調(diào)用,只有當(dāng)垃圾回收器要清除垃圾時(shí)才被調(diào)用。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lyr612556/p/7816088.html
總結(jié)
以上是生活随笔為你收集整理的随笔② Java中的关键字 --- final关键字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: React.js 小书 Lesson15
- 下一篇: 笔记6 | 从源码理解分析mScroll