Java final關(guān)鍵字:阻止繼承和多態(tài)

在 Java 中恋谭,聲明類话浇、變量和方法時(shí),可使用關(guān)鍵字 final 來修飾别威。final 所修飾的數(shù)據(jù)具有“終態(tài)”的特征躯舔,表示“最終的”意思。具體規(guī)定如下:
final 修飾的類不能被繼承省古。
final 修飾的方法不能被子類重寫粥庄。
final 修飾的變量(成員變量或局部變量)即成為常量,只能賦值一次豺妓。
final 修飾的成員變量必須在聲明的同時(shí)賦值惜互,如果在聲明的時(shí)候沒有賦值,那么只有 一次賦值的機(jī)會(huì)琳拭,而且只能在構(gòu)造方法中顯式賦值训堆,然后才能使用。
final 修飾的局部變量可以只聲明不賦值白嘁,然后再進(jìn)行一次性的賦值坑鱼。

final 一般用于修飾那些通用性的功能、實(shí)現(xiàn)方式或取值不能隨意被改變的數(shù)據(jù)絮缅,以避免被誤用鲁沥,例如實(shí)現(xiàn)數(shù)學(xué)三角方法、冪運(yùn)算等功能的方法耕魄,以及數(shù)學(xué)常量π=3.141593画恰、e=2.71828 等。

事實(shí)上吸奴,為確保終態(tài)性允扇,提供了上述方法和常量的 java.lang.Math 類也已被定義為final 的缠局。

需要注意的是,如果將引用類型(任何類的類型)的變量標(biāo)記為 final考润,那么該變量不能指向任何其它對(duì)象狭园。但可以改變對(duì)象的內(nèi)容,因?yàn)橹挥幸帽旧硎?final 的糊治。

如果變量被標(biāo)記為 final妙啃,其結(jié)果是使它成為常數(shù)。想改變 final 變量的值會(huì)導(dǎo)致一個(gè)編譯錯(cuò)誤俊戳。下面是一個(gè)正確定義 final 變量的例子:

public final int MAX_ARRAY_SIZE = 25;  // 常量名一般大寫

常量因?yàn)橛?final 修飾揖赴,所以不能被繼承。

請(qǐng)看下面的代碼:

public final class Demo{
    public static final int TOTAL_NUMBER = 5;
    public int id;
    public Demo() {
        // 非法抑胎,對(duì)final變量TOTAL_NUMBER進(jìn)行二次賦值了
        // 因?yàn)?+TOTAL_NUMBER相當(dāng)于 TOTAL_NUMBER=TOTAL_NUMBER+1
        id = ++TOTAL_NUMBER;
    }
    public static void main(String[] args) {
        final Demo t = new Demo();
        final int i = 10;
        final int j;
        j = 20;
        j = 30;  // 非法燥滑,對(duì)final變量進(jìn)行二次賦值
    }
}

final 也可以用來修飾類(放在 class 關(guān)鍵字前面),阻止該類再派生出子類阿逃,例如 Java.lang.String 就是一個(gè) final 類铭拧。這樣做是出于安全原因,因?yàn)橐WC一旦有字符串的引用恃锉,就必須是類 String 的字符串搀菩,而不是某個(gè)其它類的字符串(String 類可能被惡意繼承并篡改)。

方法也可以被 final 修飾破托,被 final 修飾的方法不能被覆蓋肪跋;變量也可以被 final 修飾,被 final 修飾的變量在創(chuàng)建對(duì)象以后就不允許改變它們的值了土砂。一旦將一個(gè)類聲明為 final州既,那么該類包含的方法也將被隱式地聲明為 final,但是變量不是萝映。

被 final 修飾的方法為靜態(tài)綁定吴叶,不會(huì)產(chǎn)生多態(tài)(動(dòng)態(tài)綁定),程序在運(yùn)行時(shí)不需要再檢索方法表序臂,能夠提高代碼的執(zhí)行效率蚌卤。在Java中,被 static 或 private 修飾的方法會(huì)被隱式的聲明為 final奥秆,因?yàn)閯?dòng)態(tài)綁定沒有意義逊彭。

由于動(dòng)態(tài)綁定會(huì)消耗資源并且很多時(shí)候沒有必要,所以有一些程序員認(rèn)為:除非有足夠的理由使用多態(tài)性吭练,否則應(yīng)該將所有的方法都用 final 修飾诫龙。

這樣的認(rèn)識(shí)未免有些偏激析显,因?yàn)?JVM 中的即時(shí)編譯器能夠?qū)崟r(shí)監(jiān)控程序的運(yùn)行信息鲫咽,可以準(zhǔn)確的知道類之間的繼承關(guān)系签赃。如果一個(gè)方法沒有被覆蓋并且很短,編譯器就能夠?qū)λM(jìn)行優(yōu)化處理分尸,這個(gè)過程為稱為內(nèi)聯(lián)(inlining)锦聊。例如,內(nèi)聯(lián)調(diào)用 e.getName() 將被替換為訪問 e.name 變量箩绍。這是一項(xiàng)很有意義的改進(jìn)孔庭,這是由于CPU在處理調(diào)用方法的指令時(shí),使用的分支轉(zhuǎn)移會(huì)擾亂預(yù)取指令的策略材蛛,所以圆到,這被視為不受歡迎的。然而卑吭,如果 getName() 在另外一個(gè)類中被覆蓋芽淡,那么編譯器就無法知道覆蓋的代碼將會(huì)做什么操作,因此也就不能對(duì)它進(jìn)行內(nèi)聯(lián)處理了豆赏。

從去年到現(xiàn)在挣菲,我根據(jù)市場技術(shù)棧的需求,錄制了一套最新的Java精講視頻教程掷邦,如果你現(xiàn)在也在學(xué)習(xí)Java白胀,在入門學(xué)習(xí)Java的過程當(dāng)中缺乏系統(tǒng)的學(xué)習(xí)教程,你可以加我的Java學(xué)習(xí)交流群:641121948抚岗,獲取或杠,群文件還有學(xué)習(xí)手冊(cè),面試題宣蔚,開發(fā)工具廷痘,PDF文檔教程,可以自行下載件已。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笋额,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子篷扩,更是在濱河造成了極大的恐慌兄猩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鉴未,死亡現(xiàn)場離奇詭異枢冤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铜秆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門淹真,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人连茧,你說我怎么就攤上這事核蘸∥∨矗” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵客扎,是天一觀的道長祟峦。 經(jīng)常有香客問我,道長徙鱼,這世上最難降的妖魔是什么宅楞? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮袱吆,結(jié)果婚禮上厌衙,老公的妹妹穿的比我還像新娘。我一直安慰自己绞绒,他們只是感情好迅箩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著处铛,像睡著了一般饲趋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撤蟆,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天奕塑,我揣著相機(jī)與錄音,去河邊找鬼家肯。 笑死龄砰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讨衣。 我是一名探鬼主播换棚,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼反镇!你這毒婦竟也來了固蚤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤歹茶,失蹤者是張志新(化名)和其女友劉穎夕玩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惊豺,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡燎孟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尸昧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揩页。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烹俗,靈堂內(nèi)的尸體忽然破棺而出爆侣,到底是詐尸還是另有隱情萍程,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布累提,位于F島的核電站,受9級(jí)特大地震影響磁浇,放射性物質(zhì)發(fā)生泄漏斋陪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一置吓、第九天 我趴在偏房一處隱蔽的房頂上張望无虚。 院中可真熱鬧,春花似錦衍锚、人聲如沸友题。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽度宦。三九已至,卻和暖如春告匠,著一層夾襖步出監(jiān)牢的瞬間戈抄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工后专, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留划鸽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓戚哎,卻偏偏與公主長得像裸诽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子型凳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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