www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]今天來聊 final 關(guān)鍵字,因為最近在看的幾本書都講到了 final 關(guān)鍵字,發(fā)現(xiàn)好多小細(xì)節(jié)自己都忽視了,抽空總結(jié)了一下,分享給大家。

前言

大家好,我是狂聊君。

今天來聊 final 關(guān)鍵字,因為最近在看的幾本書都講到了 final 關(guān)鍵字,發(fā)現(xiàn)好多小細(xì)節(jié)自己都忽視了,抽空總結(jié)了一下,分享給大家。

正文

final關(guān)鍵字是一個常用的關(guān)鍵字,可以修飾變量、方法、類,用來表示它修飾的類、方法和變量不可改變,下面就聊一下使用 final 關(guān)鍵字的一些小細(xì)節(jié)。

細(xì)節(jié)一、final 修飾類成員變量和實例成員變量的賦值時機

對于類變量:

  1. 聲明變量的時候直接賦初始值
  2. 在靜態(tài)代碼塊中給類變量賦初始值

如下代碼所示:

public class FinalTest { //a變量直接賦值 private final static int a = 1; private final static int b; //b變量通過靜態(tài)代碼塊賦值 static {
        b=2;
    }}

對于實例變量:

  1. 在聲明變量的時候直接賦值
  2. 在非靜態(tài)代碼塊中賦值
  3. 在構(gòu)造器中賦初始化值

如下代碼所示:

public class FinalTest { //c變量在在聲明時直接賦值 private final int c =1; private final int d; private final int e; //d變量在非靜態(tài)代碼塊中賦值 {
        d=2;
    } //e變量在構(gòu)造器中賦值 FinalTest(){
        e=3;
    }
}

細(xì)節(jié)二、當(dāng) final 修飾的成員變量未對它進(jìn)行初始化時,會出現(xiàn)錯誤嗎?

答:會出現(xiàn)錯誤。因為 java 語法規(guī)定,final 修飾的成員變量必須由程序員顯示的初始化,系統(tǒng)不會對變量進(jìn)行隱式的初始化。

如下圖所示,未初始變量就會出現(xiàn)編譯錯誤:


final關(guān)鍵字的這8個小細(xì)節(jié),你get到幾個?


細(xì)節(jié)三、final 修飾基本類型變量和引用類型變量的區(qū)別

如果 fianl 修飾的是一個基本數(shù)據(jù)類型的數(shù)據(jù),一旦賦值后就不能再次更改。

那么 final 修飾的是引用數(shù)據(jù)類型呢?這個引用的變量能夠改變嗎?

看下面的代碼:

public class FinalTest { //在聲明final實例成員變量時進(jìn)行賦值 private final static Student student = new Student(50, "Java"); public static void main(String[] args) { //對final引用數(shù)據(jù)類型student進(jìn)行更改 student.age = 100;
        System.out.println(student.toString());
    } static class Student { private int age; private String name; public Student(int age, String name) { this.age = age; this.name = name;
        } @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + '}';
        }
    }
} //下面是打印結(jié)果 Student{age=100, name='Java'}

從打印結(jié)果可以看到:引用數(shù)據(jù)類型變量 student 的 age 屬性修改成 100,是可以修改成功的。

結(jié)論:

  1. 當(dāng) final 修飾基本數(shù)據(jù)類型變量時,不能對基本數(shù)據(jù)類型變量重新賦值,因此基本數(shù)據(jù)類型變量不能被改變。
  2. 對于引用類型變量而言,它僅僅保存的是一個引用,final 只保證這個引用類型變量所引用的地址不會發(fā)生改變,即一直引用這個對象,但這個對象里面的屬性是可以改變的。

細(xì)節(jié)四、final 修飾局部變量的場景

fianl 局部變量由程序員進(jìn)行顯示的初始化,如果 final 局部變量進(jìn)行初始化之后就不能再次進(jìn)行更改。

如果 final 變量未進(jìn)行初始化,可以進(jìn)行賦值,并且只能進(jìn)行一次賦值,一旦賦值之后再次賦值就會出錯。

下面的代碼演示 final 修飾局部變量的情況:

final關(guān)鍵字的這8個小細(xì)節(jié),你get到幾個?

細(xì)節(jié)五、final 修飾方法會對重載有影響嗎?重寫呢?

對于重載:final 修飾方法后是可以重載的

如下代碼:

public class FinalTest { public final void test(){

    } //重載方法不會出現(xiàn)問題 public final void test(String test){

    }
}

對于重寫:當(dāng)父類的方法被 final 修飾的時候,子類不能重寫父類的該方法

final關(guān)鍵字的這8個小細(xì)節(jié),你get到幾個?

如上代碼所示,可以看到會出現(xiàn) cannot override ,overridden method is final 的編譯錯誤提示

細(xì)節(jié)六、final 修飾類的場景

當(dāng)用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠(yuǎn)不會讓他被繼承,就可以用 final 進(jìn)行修飾。

final 類中的成員變量可以根據(jù)需要設(shè)為 final,但是要注意 final 類中的所有成員方法都會被隱式地指定為 final 方法。

細(xì)節(jié)七、寫 final 域的重排序規(guī)則,你知道嗎?

這個規(guī)則是指禁止對 final 域的寫重排序到構(gòu)造函數(shù)之外,這個規(guī)則的實現(xiàn)主要包含了兩個方面:

  1. JMM 禁止編譯器把 final 域的寫重排序 到 構(gòu)造函數(shù) 之外
  2. 編譯器會在 final 域?qū)懼螅瑯?gòu)造函數(shù) return 之前,插入一個 StoreStore 屏障。這個屏障可以禁止處理器把 final 域的寫重排序到構(gòu)造函數(shù)之外

給舉個例子,要不太抽象了,先看一段代碼

public class FinalTest{ private int a; //普通域 private final int b; //final域 private static FinalTest finalTest; public FinalTest() {
        a = 1; // 1. 寫普通域 b = 2; // 2. 寫final域 } public static void writer() {
        finalTest = new FinalTest();
    } public static void reader() {
        FinalTest demo = finalTest; // 3.讀對象引用 int a = demo.a; //4.讀普通域 int b = demo.b; //5.讀final域 }
}

假設(shè)線程 A 在執(zhí)行 writer()方法,線程 B 執(zhí)行 reader()方法。

由于變量 a 和變量 b 之間沒有依賴性,所以就有可能會出現(xiàn)下圖所示的重排序

final關(guān)鍵字的這8個小細(xì)節(jié),你get到幾個?

由于普通變量 a 可能會被重排序到構(gòu)造函數(shù)之外,所以線程 B 就有可能讀到的是普通變量 a 初始化之前的值(零值),這樣就可能出現(xiàn)錯誤。

而 final 域變量 b,根據(jù)重排序規(guī)則,會禁止 final 修飾的變量 b 重排序到構(gòu)造函數(shù)之外,從而 b 能夠正確賦值,線程 B 就能夠讀到 final 域變量 b初始化后的值。

結(jié)論:寫 final 域的重排序規(guī)則可以確保在對象引用為任意線程可見之前,對象的 final 域已經(jīng)被正確初始化過了,而普通域就不具有這個保障。

細(xì)節(jié)八:讀 final 域的重排序規(guī)則,你知道嗎?

這個規(guī)則是指在一個線程中,初次讀對象引用和初次讀該對象包含的 final 域,JMM 會禁止這兩個操作的重排序。

還是上面那段代碼

public class FinalTest{ private int a; //普通域 private final int b; //final域 private static FinalTest finalTest; public FinalTest() {
        a = 1; // 1. 寫普通域 b = 2; // 2. 寫final域 } public static void writer() {
        finalTest = new FinalTest();
    } public static void reader() {
        FinalTest demo = finalTest; // 3.讀對象引用 int a = demo.a; //4.讀普通域 int b = demo.b; //5.讀final域 }
}

假設(shè)線程 A 在執(zhí)行 writer()方法,線程 B 執(zhí)行 reader()方法。

線程 B 可能就會出現(xiàn)下圖所示的重排序

final關(guān)鍵字的這8個小細(xì)節(jié),你get到幾個?

可以看到,由于讀對象的普通域被重排序到了讀對象引用的前面,就會出現(xiàn)線程 B 還未讀到對象引用就在讀取該對象的普通域變量,這顯然是錯誤的操作。而 final 域的讀操作就“限定”了在讀 final 域變量前已經(jīng)讀到了該對象的引用,從而就可以避免這種情況。

結(jié)論:讀 final 域的重排序規(guī)則可以確保在讀一個對象的 final 域之前,一定會先讀包含這個 final 域的對象的引用。

結(jié)束

今天給大家總結(jié)了一下使用 final 關(guān)鍵字容易忽視的一些小細(xì)節(jié),看完希望你能有所收獲。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉