詳解Java中的final關(guān)鍵字
1 修飾屬性或者變量
無(wú)論屬性是基本類(lèi)型還是引用類(lèi)型,作用都是變量里面存放的“值”不可變
經(jīng)常和static關(guān)鍵字一起使用,作為常量
1 基本類(lèi)型,變量放的是實(shí)實(shí)在在的值,如1,“abc”等
2 引用類(lèi)型,變量放的是個(gè)地址,所以用final修飾引用類(lèi)型變量指的是它里面的地址不能變,即它只能指向初始時(shí)指向的那個(gè)對(duì)象,而不關(guān)心指向的對(duì)象內(nèi)容的變化
所以修飾的變量必須被初始化
public static final String LOAN = "loan"; LOAN = new String("loan") //invalid compilation error
定義時(shí)
1 初始化塊中,但不可在靜態(tài)初始化塊中,靜態(tài)的final實(shí)例變量才可以在靜態(tài)初始化塊中
2 構(gòu)造方法中,但靜態(tài)final實(shí)例變量不可以在其中
3 final變量是只讀的
2 修飾方法
該方法可被繼承,但不許被任何子類(lèi)重寫(xiě)
當(dāng)調(diào)用final方法時(shí),直接將方法主體插入到調(diào)用處,而不是進(jìn)行方法調(diào)用,這樣能提高程序效率(內(nèi)聯(lián)機(jī)制)
如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了,子類(lèi)中不需要改變的話(huà),你可以聲明此方法為final
final方法比非final方法快,因?yàn)樵诰幾g時(shí)候已靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定。
class PersonalLoan{ public final String getName(){ return "personal loan"; } } class CheapPersonalLoan extends PersonalLoan{ @Override public final String getName(){ return "cheap personal loan"; //compilation error: overridden method is final } }
3 修飾類(lèi)
使用final來(lái)修飾的類(lèi)叫作final類(lèi)
final類(lèi)通常功能是完整的,不能被繼承
Java中有許多類(lèi)是final的,譬如String, Interger以及其他包裝類(lèi)
類(lèi)不可以被繼承,但這并非表示final類(lèi)的實(shí)例變量也不可變,除非給實(shí)例變量也增加final修飾
final class PersonalLoan{ } class CheapPersonalLoan extends PersonalLoan{ //compilation error: cannot inherit from final class }
一個(gè)類(lèi)不可同時(shí)被abstract和final修飾
思考一個(gè)有趣的現(xiàn)象:
byte b1=1;byte b2=3;byte b3=b1+b2; //當(dāng)程序執(zhí)行到這一行的時(shí)候會(huì)出錯(cuò),因?yàn)閎1、b2可以自動(dòng)轉(zhuǎn)換成int類(lèi)型的變量,運(yùn)算時(shí)java虛擬機(jī)對(duì)它進(jìn)行了轉(zhuǎn)換,結(jié)果導(dǎo)致把一個(gè)int賦值給bytefinal byte b1=1;final byte b2=3;byte b3=b1+b2; //不會(huì)出錯(cuò),相信你看了上面的解釋就知道原因了。
4 final關(guān)鍵字的好處
1 提高性能
JVM和Java應(yīng)用都會(huì)緩存final變量。
2 final變量可以安全的在多線(xiàn)程環(huán)境下進(jìn)行共享,而不需要額外的同步開(kāi)銷(xiāo)。
3 使用final關(guān)鍵字,JVM會(huì)對(duì)方法、變量及類(lèi)進(jìn)行優(yōu)化。
5 不可變類(lèi)
創(chuàng)建不可變類(lèi)要使用final關(guān)鍵字。不可變類(lèi)是指它的對(duì)象一旦被創(chuàng)建了就不能被更改了。String是不可變類(lèi)的代表。不可變類(lèi)有很多好處,譬如它們的對(duì)象是只讀的,可以在多線(xiàn)程環(huán)境下安全的共享,不用額外的同步開(kāi)銷(xiāo)等等。
6 其他重要知識(shí)點(diǎn)
不能夠?qū)inal變量再賦值
本地變量必須在聲明時(shí)賦值
在匿名類(lèi)中所有變量都必須final
final關(guān)鍵字不同于finally關(guān)鍵字,后者用于異常處理
final關(guān)鍵字容易與finalize()方法搞混,后者是在Object類(lèi)中定義的方法,是在垃圾回收之前被JVM調(diào)用的方法
接口中聲明的所有變量本身是final
final和abstract這兩個(gè)關(guān)鍵字反相關(guān),final類(lèi)不能abstract
final方法在編譯階段綁定,稱(chēng)為靜態(tài)綁定(static binding)
沒(méi)在聲明時(shí)初始化final變量的稱(chēng)為空白final變量(blank final variable),須在構(gòu)造器中初始化,或調(diào)用this()初始化。不這么做的話(huà),編譯器會(huì)報(bào)錯(cuò)“final變量(變量名)需要進(jìn)行初始化”
final變量就是常量,而且通常常量名要大寫(xiě)
private final int COUNT = 10;
對(duì)于集合對(duì)象聲明為final指的是引用不能被更改,但是你可以向其中增加,刪除或者改變內(nèi)容。譬如:
private final List Loans = new ArrayList();list.add(“home loan”); //validlist.add("personal loan"); //validloans = new Vector(); //not valid
以上就是詳解Java-final關(guān)鍵字的詳細(xì)內(nèi)容,更多關(guān)于Java-final關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java中關(guān)鍵字final finally finalize的區(qū)別介紹
- Java中final關(guān)鍵字和final的4種用法
- Java關(guān)鍵字詳解之final static this super的用法
- Java基礎(chǔ)之final關(guān)鍵字作用案例
- Java中final關(guān)鍵字的使用與注意總結(jié)
- Java中final關(guān)鍵字詳解及實(shí)例
- 學(xué)習(xí)Java的static與final關(guān)鍵字
- Java關(guān)鍵字final、static使用總結(jié)
- Java中的final關(guān)鍵字使用方式
相關(guān)文章
Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例
這篇文章主要介紹了Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11詳解Java構(gòu)建樹(shù)結(jié)構(gòu)的公共方法
本文主要介紹了詳解Java構(gòu)建樹(shù)結(jié)構(gòu)的公共方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04修改jar包package目錄結(jié)構(gòu)操作方法
這篇文章主要介紹了修改jar包package目錄結(jié)構(gòu)操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07解決org.springframework.context.ApplicationContextException報(bào)錯(cuò)的
這篇文章主要介紹了解決org.springframework.context.ApplicationContextException報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06解決Springboot項(xiàng)目bootstrap.yml不生效問(wèn)題
Spring Boot 2.4版本開(kāi)始,配置文件加載方式進(jìn)行了重構(gòu),只會(huì)識(shí)別application.* 配置文件,并不會(huì)自動(dòng)識(shí)別bootstrap.yml,所以本文給大家介紹Springboot項(xiàng)目bootstrap.yml不生效問(wèn)題的解決方案,需要的朋友可以參考下2023-09-09springboot啟動(dòng)的注意事項(xiàng)之不同包下有同樣名字的class類(lèi)問(wèn)題
這篇文章主要介紹了springboot啟動(dòng)的注意事項(xiàng)之不同包下有同樣名字的class類(lèi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06java開(kāi)發(fā)之內(nèi)部類(lèi)的用法
本篇文章介紹了,java開(kāi)發(fā)之內(nèi)部類(lèi)的用法。需要的朋友參考下2013-05-05