Java final 關鍵字總結

1. 含義

  • 在不同使用場景下率翅,有細微的區(qū)別,總體是指的是"這是不可變的"
  • final的保留關鍵字,可以聲明成員變量(實例變量,屬性)、本地變量(局部變量)昔字、方法银觅、類
  • 引用聲明為final,則不能改變這個引用,不能再次初始化
  • final 合理運用可以改善性能
  • final變量是只讀的(對于非引用類型)

2. 修飾變量

  • 使用final修飾變量,只能進行一次賦值操作,并且在生存周期內不可以改變它的值
  • final修飾的變量,可以不在聲明時賦值,即可以先聲明,后賦值
  • final修飾基本類型時,其值不能改變
  • final修飾成員變量,可以賦值的地方,一是聲明時就賦值,二是在構造方法方法
  • 類變量可以在靜態(tài)塊中賦值或聲明時賦值
  • final修飾引用類型時践宴,不能再次初始化,即限定了引用變量的引用(內存地址)不可改變鲸匿,但引用對象的值是可以改變的
  • 同時使用static和final修飾成員在內存中只占據(jù)一段不能改變的存儲空間

代碼示例如下:

class Value {
    int v;
    public Value(int v) {
        this.v = v;
    }
}

public class FinalTest {
    
    final int f1 = 1;
    final int f2;
    public FinalTest() {
        f2 = 2;
    }

    public static void main(String[] args) {
        final int value1 = 1;
        // value1 = 4;
        final double value2;
        // value2 只能賦值一次
        value2 = 2.0;
        final Value value3 = new Value(1);
        // value3中v的值可以變
        value3.v = 4;
    }
}

3. 修飾方法參數(shù)

  • 在方法的聲明中,在參數(shù)前添加final關鍵字
  • 表示在整個方法中阻肩,都不能改變參數(shù)的值或引用
  • 如果方法聲明參數(shù)類型為基本類型带欢,則表示其值不能改變
  • 如果方法聲明參數(shù)類型為引用類型,則表示其引用不能改變,但引用對象的值可以改變

代碼示例

public class FinalTest {

    /* ... */

    public void finalFunc(final int i, final Value value) {
        // i = 5; 不能改變i的值
        // v = new Value(); 不能改變v的值
        value.v = 5; // 可以改變引用對象的值
    }
}

4. 修飾方法

  • 修飾方法表示該方法不能被覆蓋
  • 類中所有的private方法都隱式地指定為是final的
  • 設計角度理解烤惊,即明確告訴其他可能會繼承該類的程序員乔煞,不希望去覆蓋這個方法
  • final方法比非final方法要快,編譯時已經靜態(tài)綁定,不需要在運行時再動態(tài)綁定

5. 修飾類

  • final修飾的類是無法被繼承的
  • JDK很多類都final的,如String,Integer以及其他包裝類
  • 不可變類一旦被創(chuàng)建就不能再更改
  • 不可變類好處:
    • 對象是只讀的
    • 可以在多線程環(huán)境下安全的共享
    • 不用額外的同步開銷

6. 優(yōu)點

  • final關鍵字提高了性能
  • JVM和java應用都會緩存final變量
  • final變量可以在安全的在多線程環(huán)境中共享,而不需要額外的同步開銷
  • 使用final關鍵字,JVM會對方法、變量及類進行優(yōu)化

7. 要點

  • final關鍵字可以用于成員變量柒室、本地變量渡贾、方法以及類。
  • final成員變量必須在聲明的時候初始化或者在構造器中初始化伦泥,否則就會報編譯錯誤剥啤。
  • 你不能夠對final變量再次賦值。
  • 本地變量必須在聲明時賦值不脯。
  • 在匿名類中所有變量都必須是final變量府怯。
  • final方法不能被重寫。
  • final類不能被繼承防楷。
  • final關鍵字不同于finally關鍵字牺丙,后者用于異常處理。
  • final關鍵字容易與finalize()方法搞混复局,后者是在Object類中定義的方法冲簿,是在垃圾回收之前被JVM調用的方法。
  • 接口中聲明的所有變量本身是final的亿昏。
  • final和abstract這兩個關鍵字是反相關的峦剔,final類就不可能是abstract的。
  • final方法在編譯階段綁定角钩,稱為靜態(tài)綁定(static binding)吝沫。
  • 沒有在聲明時初始化final變量的稱為空白final變量(blank final variable),它們必須在構造器中初始化递礼,或者調用this()初始化惨险。不這么做的話,編譯器會報錯“final變量(變量名)需要進行初始化”脊髓。
  • 將類辫愉、方法、變量聲明為final能夠提高性能将硝,這樣JVM就有機會進行估計恭朗,然后優(yōu)化屏镊。
  • 按照Java代碼慣例,final變量就是常量冀墨,而且通常常量名要大寫:
private final int COUNT = 10;
  • 對于集合對象聲明為final指的是引用不能被更改闸衫,但是你可以向其中增加,刪除或者改變內容诽嘉。
private final List Loans = new ArrayList();
list.add(“home loan”);  //valid
list.add("personal loan"); //valid
loans = new Vector();  //not valid

8.參考

深入理解Java中的final關鍵字

[java]final關鍵字的幾種用法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蔚出,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虫腋,更是在濱河造成了極大的恐慌骄酗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦冀,死亡現(xiàn)場離奇詭異趋翻,居然都是意外死亡,警方通過查閱死者的電腦和手機盒蟆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門踏烙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人历等,你說我怎么就攤上這事讨惩。” “怎么了寒屯?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵荐捻,是天一觀的道長。 經常有香客問我寡夹,道長处面,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任菩掏,我火速辦了婚禮魂角,結果婚禮上,老公的妹妹穿的比我還像新娘智绸。我一直安慰自己或颊,他們只是感情好,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布传于。 她就那樣靜靜地躺著,像睡著了一般醉顽。 火紅的嫁衣襯著肌膚如雪沼溜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天游添,我揣著相機與錄音系草,去河邊找鬼通熄。 笑死,一個胖子當著我的面吹牛找都,可吹牛的內容都是我干的唇辨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼能耻,長吁一口氣:“原來是場噩夢啊……” “哼赏枚!你這毒婦竟也來了?” 一聲冷哼從身側響起晓猛,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤饿幅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戒职,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栗恩,經...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年洪燥,在試婚紗的時候發(fā)現(xiàn)自己被綠了磕秤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡捧韵,死狀恐怖市咆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情纫版,我是刑警寧澤床绪,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站其弊,受9級特大地震影響癞己,放射性物質發(fā)生泄漏。R本人自食惡果不足惜梭伐,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一痹雅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糊识,春花似錦绩社、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拌滋,卻和暖如春朴沿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工赌渣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魏铅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓坚芜,卻偏偏與公主長得像览芳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸿竖,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內容

  • 一沧竟、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向對象程序設計...
    子非魚_t_閱讀 4,164評論 1 44
  • 一、final 修飾數(shù)據(jù) 有final修飾的數(shù)據(jù)是用來告訴編譯器一塊數(shù)據(jù)是恒定不變的千贯,有時數(shù)據(jù)恒定不變是很有用的屯仗,...
    國祥同學閱讀 392評論 0 0
  • Java關鍵字final 在設計程序時,出于效率或者設計的原因搔谴,有時候希望某些數(shù)據(jù)是不可改變的魁袜。這時候可以使用fi...
    獅_子歌歌閱讀 738評論 1 4
  • 一:java概述:1,JDK:Java Development Kit敦第,java的開發(fā)和運行環(huán)境峰弹,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 是不是還 沉浸在偽忙碌中 不痛不癢 為什么不 和最珍惜你的人 共享時光 找個時間 靜下心來和自己說說話 聽聽他的想...
    yorickshan閱讀 273評論 0 0