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