最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中final關(guān)鍵字的各種用法和注意事項詳解

 更新時間:2026年01月19日 09:23:22   作者:看透也說透kevin  
final關(guān)鍵字在Java中用于實現(xiàn)不可變的特性,分別應(yīng)用于類、方法和變量時,有著不同的作用和注意事項,這篇文章主要介紹了java中final關(guān)鍵字的各種用法和注意事項的相關(guān)資料,需要的朋友可以參考下

一、final 修飾變量

當(dāng)一個變量被聲明為 final 時,它只能被賦值一次。一旦被初始化,其值就不能再被改變。這類似于其他語言中的“常量”概念。

根據(jù)變量類型的不同,其“不可變”的含義略有差異:

1. final 基本類型變量

值本身不可變。

final int maxRetries = 5;
// maxRetries = 10; // 編譯錯誤!不能再次賦值

2. final 引用類型變量

引用本身不可變,但其所指向的對象內(nèi)部的狀態(tài)是可以改變的(除非對象本身也是不可變對象,如 String)。

final StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // ?? 允許:修改對象內(nèi)部狀態(tài)
// sb = new StringBuilder(); // ? 編譯錯誤!不能改變引用指向另一個對象

初始化時機(jī):

final 變量必須在聲明時構(gòu)造函數(shù)結(jié)束前被初始化。

  • final 實例變量:必須在聲明時、實例初始化塊中或每個構(gòu)造函數(shù)結(jié)束前被初始化。
  • final 靜態(tài)變量(常量):必須在聲明時、靜態(tài)初始化塊中被初始化。
class Example {
    final int instanceVar; // 必須在構(gòu)造函數(shù)中初始化
    static final String CONSTANT = "Value"; // 聲明時初始化

    public Example(int value) {
        this.instanceVar = value; // 初始化
    }
}

二、final 修飾方法

當(dāng)一個方法被聲明為 final 時,意味著該方法不能被子類重寫(Override)

使用場景:

  1. 防止繼承改變核心邏輯:確保父類中的某個方法行為在子類中保持不變,防止其被意外修改,保證程序的安全性、一致性和正確性。
  2. 效率考慮(歷史原因):早期 Java 版本中,final 方法在編譯時可能會被內(nèi)聯(lián)(Inline),帶來微小的性能提升。但現(xiàn)代 JVM 非常智能,會自動完成優(yōu)化,這個理由如今已不那么重要。
class Parent {
    // 此方法不能被子類重寫
    public final void criticalBusinessLogic() {
        // ... 核心算法
    }
}

class Child extends Parent {
    // ? 編譯錯誤!Cannot override the final method
    // @Override
    // public void criticalBusinessLogic() { ... }
}

三、final 修飾類

當(dāng)一個類被聲明為 final 時,意味著這個類不能被繼承,即不能有子類。

使用場景:

  1. 設(shè)計上的“終結(jié)”:表示這個類在設(shè)計上已經(jīng)非常完善,不需要也不應(yīng)該被擴(kuò)展,例如 String、Integer 等包裝類。這保證了該類行為的絕對穩(wěn)定和安全。
  2. 安全:防止惡意代碼通過創(chuàng)建子類來破壞核心功能(例如通過重寫方法)。
  3. 不可變類:創(chuàng)建不可變類(Immutable Class)時,類本身通常被聲明為 final,以防止子類化破壞其不可變性。
final class ImmutableClass {
    private final int value;

    public ImmutableClass(int value) {
        this.value = value;
    }
    // 只有g(shù)etter,沒有setter
    public int getValue() {
        return value;
    }
}

// ? 編譯錯誤!Cannot inherit from final class
// class SubClass extends ImmutableClass { ... }

四、final 修飾參數(shù)

方法參數(shù)也可以被聲明為 final。這表示該參數(shù)在方法體內(nèi)不能被重新賦值。

使用場景與優(yōu)點:

  1. 代碼清晰與安全:明確表示這個參數(shù)的值在方法內(nèi)不會被改變,提高了代碼的可讀性和可維護(hù)性。
  2. 用于匿名內(nèi)部類:在 Java 8 之前,如果匿名內(nèi)部類需要訪問一個局部變量,該變量必須被聲明為 final。Java 8 引入了“有效最終(effectively final)”的概念(即變量雖然沒有明確聲明為 final,但自初始化后從未被修改),使得語法上不再強(qiáng)制要求 final 關(guān)鍵字,但其語義仍然是不可變的。
// Java 8 之前:必須加 final
public void oldMethod() {
    final int oldVar = 10;
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(oldVar); // 需要訪問外部局部變量
        }
    }).start();
}

// Java 8 及之后:effectively final 即可
public void newMethod() {
    int newVar = 10; // 沒有 final,但從未被修改,所以是 effectively final
    new Thread(() -> System.out.println(newVar)).start(); // 可以訪問
    // newVar = 20; // 如果加上這行,newVar 就不再是 effectively final,上面的lambda表達(dá)式會報錯
}

建議:即使在新版本中,為了代碼清晰和防止意外修改,很多編碼規(guī)范依然建議將不會被修改的參數(shù)顯式地聲明為 final。

五、重要注意事項總結(jié)

  1. 空白 final(Blank Final):聲明時未初始化的 final 變量稱為“空白 final”。必須在構(gòu)造函數(shù)中完成初始化,編譯器會嚴(yán)格檢查這一點。
  2. final 與靜態(tài)(static)static final 組合用于定義類級別的全局常量,命名規(guī)范通常使用全大寫字母和下劃線(如 MAX_VALUE)。
  3. final 與并發(fā):final 變量的初始化安全由 JMM(Java內(nèi)存模型)保證。一個正確構(gòu)造的對象的 final 字段,在任何線程中看到時,都已經(jīng)是初始化完成的值。這使得在不使用同步的情況下,也能安全地發(fā)布不可變對象。
  4. 性能:現(xiàn)代 JVM 對 final 的優(yōu)化已經(jīng)非常成熟,不必過分追求使用 final 來提升性能。應(yīng)更多地將其用于設(shè)計目的,如保證不可變性和安全性。
  5. 集合與 finalfinal List<String> myList = new ArrayList<>(); 只表示引用 myList 不能指向另一個 ArrayList,但仍然可以調(diào)用 myList.add("item") 來修改列表內(nèi)容。如果要一個完全不可變的集合,應(yīng)使用 Collections.unmodifiableList() 或 Java 9+ 的 List.of() 等方法。

總結(jié)表

修飾目標(biāo)含義關(guān)鍵點
變量(基本類型)值不可變只能賦值一次
變量(引用類型)引用不可變不能指向新對象,但對象內(nèi)部狀態(tài)可修改
方法不能被子類重寫(Override)用于鎖定方法實現(xiàn),保證核心邏輯
不能被繼承常用于工具類、不可變類或出于安全考慮的核心類(如 String
參數(shù)方法內(nèi)部不能對參數(shù)重新賦值提高代碼可讀性,是匿名內(nèi)部類/λ表達(dá)式訪問外部變量的基礎(chǔ)(Java 8+ 為 effectively final)

希望這個詳細(xì)的解釋能幫助你全面理解 Java 中的 final 關(guān)鍵字!

到此這篇關(guān)于java中final關(guān)鍵字的各種用法和注意事項的文章就介紹到這了,更多相關(guān)java final關(guān)鍵字用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java實現(xiàn)qq郵箱發(fā)送郵件

    使用Java實現(xiàn)qq郵箱發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了使用Java實現(xiàn)qq郵箱發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2010-05-05
  • java io讀取文件操作代碼實例

    java io讀取文件操作代碼實例

    這篇文章主要介紹了java io讀取文件操作代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 基于java枚舉類綜合應(yīng)用的說明

    基于java枚舉類綜合應(yīng)用的說明

    一個枚舉類,可以看成包括它的一些子類(枚舉)的一個類,而且枚舉類的構(gòu)造方法只能是私有的
    2013-05-05
  • Java泛型變量如何添加約束

    Java泛型變量如何添加約束

    這篇文章主要介紹了Java泛型變量如何添加約束,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 使用spring框架中的組件發(fā)送郵件功能說明

    使用spring框架中的組件發(fā)送郵件功能說明

    Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。這篇文章主要介紹了使用spring框架中的組件發(fā)送郵件,需要的朋友可以參考下
    2017-11-11
  • SpringBoot中動態(tài)注入Bean的技巧分享

    SpringBoot中動態(tài)注入Bean的技巧分享

    在 Spring Boot 開發(fā)中,動態(tài)注入 Bean 是一種強(qiáng)大的技術(shù),它允許我們根據(jù)特定條件或運(yùn)行時環(huán)境靈活地創(chuàng)建和管理 Bean,本文將介紹 Spring Boot 中三種動態(tài) Bean 注入技巧,需要的可以參考一下
    2025-06-06
  • Springboot結(jié)合Flowable實現(xiàn)工作流開發(fā)

    Springboot結(jié)合Flowable實現(xiàn)工作流開發(fā)

    本文主要介紹了Springboot結(jié)合Flowable實現(xiàn)工作流開發(fā),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java中不得不知的Collection接口與Iterator迭代器

    Java中不得不知的Collection接口與Iterator迭代器

    這篇文章主要介紹了Java中的Collection接口與Iterator迭代器,文中有詳細(xì)的代碼示例供大家參考,對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • 解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題

    解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題

    這篇文章主要介紹了spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot 事務(wù)實戰(zhàn)之如何解決 DB 與 MQ 的"雙寫不一致"問題

    Spring Boot 事務(wù)實戰(zhàn)之如何解決 DB 與 MQ 

    本文結(jié)合代碼案例探討如何利用Spring的 TransactionSynchronizationManager 實現(xiàn)事務(wù)提交后觸發(fā)(Trigger After Commit)機(jī)制,優(yōu)雅解決數(shù)據(jù)庫與消息隊列的"雙寫一致性"問題,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

灯塔市| 伽师县| 颍上县| 兴宁市| 昌黎县| 广汉市| 武穴市| 罗山县| 武胜县| 城口县| 富平县| 阜宁县| 陕西省| 兴隆县| 万年县| 措勤县| 友谊县| 宿州市| 荆州市| 长宁县| 纳雍县| 凤山市| 吴忠市| 柯坪县| 澳门| 贵州省| 买车| 商都县| 乌恰县| 苍山县| 岱山县| 尚义县| 罗定市| 永春县| 兴和县| 方正县| 库尔勒市| 杭锦后旗| 黎川县| 盘山县| 雷山县|