java中final關(guān)鍵字詳解及用法詳解
前言
在Java中,final
關(guān)鍵字用于限制類、方法和變量的可變性,確保代碼的安全性和清晰度。以下是其詳細(xì)作用及使用場(chǎng)景:
1. final修飾類
- 作用:被
final
修飾的類不能被繼承,即不能有子類。 - 使用場(chǎng)景:
- 防止類被擴(kuò)展或修改,例如
String
、Integer
等不可變類。 - 確保類的行為或安全性(如工具類)。
- 防止類被擴(kuò)展或修改,例如
- 示例:
final class ImmutableClass { // 類內(nèi)容 } // 編譯錯(cuò)誤:無法繼承final類 // class SubClass extends ImmutableClass {}
2. final修飾方法
- 作用:被
final
修飾的方法不能被子類重寫(Override)。 - 使用場(chǎng)景:
- 確保方法邏輯在繼承體系中保持不變,避免子類修改關(guān)鍵行為。
- 與性能優(yōu)化相關(guān)(早期Java版本可能內(nèi)聯(lián)final方法)。
- 示例:
class Parent { final void criticalMethod() { System.out.println("關(guān)鍵方法,不可重寫"); } } class Child extends Parent { // 編譯錯(cuò)誤:無法重寫final方法 // @Override void criticalMethod() {} }
3. final修飾變量
final
變量的值只能被賦值一次,之后不可修改。
3.1 成員變量(實(shí)例變量)
- 必須初始化:可在聲明時(shí)、構(gòu)造方法或初始化塊中賦值。
- 線程安全:正確初始化的
final
變量可安全發(fā)布到其他線程(JMM保證)。 - 示例:
class MyClass { final int value; MyClass(int value) { this.value = value; // 必須在構(gòu)造方法中初始化 } }
3.2 局部變量
- 必須初始化:在聲明時(shí)或后續(xù)代碼中賦值一次。
- 匿名內(nèi)部類訪問:在Java 8之前,匿名內(nèi)部類只能訪問
final
局部變量;Java 8+支持effectively final
(實(shí)際不可變的變量)。 - 示例:
void method() { final int localVar = 10; // localVar = 20; // 編譯錯(cuò)誤 }
3.3 靜態(tài)變量(類變量)
- 必須初始化:在聲明時(shí)或靜態(tài)初始化塊中賦值。
- 常量定義:通常結(jié)合
static final
定義全局常量。 - 示例:
class Constants { static final double PI = 3.14159; }
3.4 引用類型變量
- 引用不可變:變量指向的對(duì)象不能改變,但對(duì)象內(nèi)部狀態(tài)可能可變。
- 示例:
final StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 合法,修改對(duì)象內(nèi)容 // sb = new StringBuilder(); // 編譯錯(cuò)誤:引用不可變
4. final修飾參數(shù)
- 作用:方法參數(shù)被
final
修飾后,方法內(nèi)不能修改其值。 - 使用場(chǎng)景:防止參數(shù)被意外修改,提升代碼可讀性。
- 示例:
void process(final int param) { // param = 5; // 編譯錯(cuò)誤 }
5. final與性能
- 內(nèi)聯(lián)優(yōu)化:早期Java版本可能對(duì)
final
方法或變量進(jìn)行內(nèi)聯(lián)優(yōu)化,但現(xiàn)代JVM通常自動(dòng)處理。 - 代碼清晰性:
final
更多用于明確設(shè)計(jì)意圖,而非強(qiáng)制優(yōu)化。
6. 注意事項(xiàng)
- 不可變對(duì)象 ≠ final變量:
final
確保引用不變,但對(duì)象內(nèi)容可能可變(如final List
仍可增刪元素)。 - final類中的方法:隱式為
final
,無需顯式聲明。 - 權(quán)衡使用:過度使用
final
可能導(dǎo)致代碼僵化,需根據(jù)設(shè)計(jì)需求合理選擇。
總結(jié)
final
關(guān)鍵字通過限制類、方法和變量的可變性,增強(qiáng)代碼的健壯性和可維護(hù)性。合理使用可明確設(shè)計(jì)意圖,防止意外修改,適用于常量定義、不可變類設(shè)計(jì)、線程安全等場(chǎng)景。理解其在不同上下文中的作用,能更高效地編寫可靠代碼。
到此這篇關(guān)于java中final關(guān)鍵字詳解及用法的文章就介紹到這了,更多相關(guān)java final關(guān)鍵字用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus?分頁查詢的實(shí)現(xiàn)示例
本文主要介紹了MyBatis-Plus?分頁查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03add方法理解ArrayList的擴(kuò)容機(jī)制
這篇文章主要為大家介紹了add方法理解ArrayList的擴(kuò)容機(jī)制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享
這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享,設(shè)計(jì)代理模式的定義,靜態(tài)代理,動(dòng)態(tài)代理,jdk動(dòng)態(tài)代理實(shí)現(xiàn)步驟,原理及源碼等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Java程序中實(shí)現(xiàn)調(diào)用Python腳本的方法詳解
這篇文章主要介紹了Java程序中實(shí)現(xiàn)調(diào)用Python腳本的方法,結(jié)合實(shí)例形式分析了eclipse環(huán)境中使用Java調(diào)用Python腳本的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-03-03如何用java做一個(gè)word轉(zhuǎn)圖片的功能詳解
這篇文章主要給大家介紹了關(guān)于如何用java做一個(gè)word轉(zhuǎn)圖片的功能,通過實(shí)現(xiàn)Java Word轉(zhuǎn)圖片功能,避免PDF中間轉(zhuǎn)換損耗,涵蓋分頁處理、字體設(shè)置、性能優(yōu)化及替代方案對(duì)比,需要的朋友可以參考下2025-05-05淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類型
這篇文章主要介紹了淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類型,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12