深入理解 Java 中的 final 關(guān)鍵字

概述

Java 中的 final 關(guān)鍵字非常重要打瘪,它可以應(yīng)用與類幼苛、方法以及變量。這篇文章中我將帶你看看:

  • 什么是 final 關(guān)鍵字?
  • 將變量滨巴、方法和類聲明為 final 代表了什么?
  • 使用 final 的好處是什么惠遏?

最后也有一些使用 final 關(guān)鍵字的實(shí)例机打。final 經(jīng)常和 static 一起使用來聲明常量,你也會(huì)看到 final 是如何改善應(yīng)用性能的猿棉。

final 關(guān)鍵字的含義

final 在 Java 中是一個(gè)保留的關(guān)鍵字磅叛,可以聲明成員變量、方法萨赁、類以及本地變量弊琴。一旦你將引用聲明為 final,你將不能改變這個(gè)引用了杖爽,編譯器會(huì)檢查代碼敲董,如果你試圖將變量再次初始化的話,編譯器會(huì)報(bào)編譯錯(cuò)誤慰安。

什么是 final 變量

凡是對成員變量或者本地變量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為 final 的都叫做 final 變量腋寨。final 變量經(jīng)常和 static 關(guān)鍵字一起使用,作為常量化焕。
下面是 final 變量的例子:

public static final String LOAN = "loan";
LOAN = new String("loan");  // Invalid compilation error 

final 變量是只讀的萄窜。

什么是 final 方法

final 也可以聲明方法。方法前面加上 final 關(guān)鍵字,代表這個(gè)方法不可以被子類重寫查刻。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了番宁,子類中不需要改變的話,你可以聲明此方法為 final赖阻。final 方法比非 final 方法要快蝶押,因?yàn)樵诰幾g的時(shí)候已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定棋电。
下面是 final 方法的例子:

class PersonalLoan{
  public final String getName(){
    return "personal loan";
  }
}

class CheapPersonalLoan extends PersonalLoan{
  @Override
  public final String getName(){
    return "Chean personal loan"; // Compilation error:overridden method is final
  }
}

什么是 final 類

使用 final 來修飾的類叫做 final 類。final 類通常功能是完整的赶盔,他們不能被繼承榆浓。Java 中有許多類是 final 的于未,譬如 String、Integer 以及其他包裝類陡鹃。
下面是 final 類的示例:

final class PersonalLoan{ }

class CheanPersonalLoan extends PersonalLoan { // Compilation error:cannot inherit form final class  
}

final 關(guān)鍵字的好處

下面總結(jié)了一些使用 final 關(guān)鍵字的好處:

  1. final 關(guān)鍵字提高了性能烘浦。JVM 和 Java 應(yīng)用都會(huì)緩存 final 變量萍鲸。
  2. final 變量可以安全的在多線程環(huán)境下進(jìn)行共享,而不需要額外的同步開銷脊阴。
  3. 使用 final 關(guān)鍵字握侧,JVM 會(huì)對方法、變量及類進(jìn)行優(yōu)化嘿期。

不可變類

創(chuàng)建不可變類要使用 final 關(guān)鍵字品擎。不可變類是指它的對象一旦被創(chuàng)建了就不能給更改了。String 是不可變的代表萄传。不可變類有很多好處,譬如:

  • 他們的對象是只讀的盲再。
  • 可以在多線程環(huán)境下安全的共享。
  • 不用額外的同步開銷等。

關(guān)于 final 的重要知識點(diǎn)

  1. final 關(guān)鍵字可以用于成員變量贷揽、本地變量、方法以及類蓖救。
  2. final 成員變量必須在聲明的時(shí)候初始化或者在構(gòu)造器中初始化洪规,否者就會(huì)編譯報(bào)錯(cuò)循捺。
  3. 你不能夠?qū)?final 變量再次賦值。
  4. 本地變量必須在聲明時(shí)賦值从橘。
  5. 在匿名類中所有的變量都必須是 final 變量。
  6. final 方法不能被重寫叉谜。
  7. final 類不能被繼承踩萎。
  8. final 關(guān)鍵字不同于 finally 關(guān)鍵字,后者用于異常處理香府。
  9. final 關(guān)鍵字容易與 finalize() 方法搞混,后者是在 Object 類中定義的方法企孩,是在垃圾回收之前被 JVM 調(diào)用的方法。
  10. 接口中聲明的所有變量本身是 final 的工禾。
  11. final 和 abstract 這兩個(gè)關(guān)鍵字是反相關(guān)的蝗柔,final 類就不可能是 abstract 的闻葵。
  12. final 方法在編譯階段綁定,稱為靜態(tài)綁定(static binding)槽畔。
  13. 沒有在聲明時(shí)初始化 final 變量的稱為空白 final 變量(blank final variable)胁编,它們必須在構(gòu)造器中初始化,或者調(diào)用 this() 初始化嬉橙。不這么的話,編譯器會(huì)報(bào)錯(cuò)"final 變量(變量名)需要進(jìn)行初始化"市框。
  14. 將類、方法喻圃、變量聲明為 final 能夠提高性能,這樣 JVM 就有機(jī)會(huì)進(jìn)行估計(jì)斧拍,然后優(yōu)化。
  15. 按照 Java 代碼慣例肆汹,final 變量就是常量,而通常常量名要大寫:
private final int COUNT = 10;

原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末转绷,一起剝皮案震驚了整個(gè)濱河市硼啤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煞肾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件籍救,死亡現(xiàn)場離奇詭異渠抹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奇颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門放航,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荆几,你說我怎么就攤上這事《种” “怎么了蛋叼?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵剂陡,是天一觀的道長狐胎。 經(jīng)常有香客問我歌馍,道長,這世上最難降的妖魔是什么松却? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任晓锻,我火速辦了婚禮,結(jié)果婚禮上砚哆,老公的妹妹穿的比我還像新娘。我一直安慰自己躁锁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布搜立。 她就那樣靜靜地躺著槐秧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刁标。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天蒜哀,我揣著相機(jī)與錄音吏砂,去河邊找鬼。 笑死狐血,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浪默。 我是一名探鬼主播牡直,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碰逸,長吁一口氣:“原來是場噩夢啊……” “哼阔加!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胜榔,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吭露,沒想到半個(gè)月后尊惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡择浊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年琢岩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担孔。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啄育,靈堂內(nèi)的尸體忽然破棺而出拌消,到底是詐尸還是另有隱情,我是刑警寧澤墩崩,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站铝阐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徘键。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一螟凭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赂摆,春花似錦钟些、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宪赶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒙保,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工邓厕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扁瓢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓昧互,卻偏偏與公主長得像伟桅,于是被迫代替她去往敵國和親敞掘。 傳聞我的和親對象是個(gè)殘疾皇子贿讹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第6章類文件結(jié)構(gòu) 6.1 概述 6.2 無關(guān)性基石 6.3 Class類文件的結(jié)構(gòu) java虛擬機(jī)不和包括java...
    kennethan閱讀 931評論 0 2
  • final 關(guān)鍵字的含義 final 在 Java 中是一個(gè)保留的關(guān)鍵字民褂,可以聲明成員變量疯潭、方法面殖、類以及本地變量。...
    杰哥長得帥閱讀 586評論 0 0
  • Java關(guān)鍵字final 在設(shè)計(jì)程序時(shí)脊僚,出于效率或者設(shè)計(jì)的原因,有時(shí)候希望某些數(shù)據(jù)是不可改變的增淹。這時(shí)候可以使用fi...
    獅_子歌歌閱讀 743評論 1 4
  • 恍若隔世是哪樣的感覺乌企。 現(xiàn)在的我清晰而又疑惑的每一天生活工作,認(rèn)真不留遺憾加酵,卻由于不在父母身邊深感失落。 撿起扣扣...
    半朵格芍硗螅花閱讀 391評論 0 0