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)文章
Java實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn))
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn)),文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以嘗試一下2022-09-09
詳解Spring中@Component和@Configuration的區(qū)別
一直有同學(xué)搞不清Spring中@Component和@Configuration這兩個(gè)注解有什么區(qū)別,所以這篇文章小編就給大家簡(jiǎn)單介紹一下@Component和@Configuration的區(qū)別,需要的朋友可以參考下2023-07-07
使用springMVC通過Filter實(shí)現(xiàn)防止xss注入
這篇文章主要介紹了使用springMVC通過Filter實(shí)現(xiàn)防止xss注入的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
MybatisPlus特殊查詢的實(shí)現(xiàn)介紹
這篇文章主要介紹了MybatisPlus查詢投影、聚合查詢、分組查詢、等值查詢、范圍查詢、模糊查詢、排序查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10
java數(shù)據(jù)結(jié)構(gòu)與算法之插入排序詳解
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之插入排序,結(jié)合實(shí)例形式分析了java插入排序的概念、分類、原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-05-05

