java 中的 final 關(guān)鍵字用于確保變量、方法和類(lèi)的“最終性”,提供不可變性或不可繼承性。1. 用于變量時(shí),其值(基本類(lèi)型)或引用(對(duì)象類(lèi)型)一旦賦值便不可更改,但對(duì)象內(nèi)部狀態(tài)仍可變;2. 用于方法時(shí),防止子類(lèi)重寫(xiě)以固化行為,保障核心邏輯安全;3. 用于類(lèi)時(shí),禁止繼承以實(shí)現(xiàn)不可變性或提升安全性;4. final 與 finally、finalize 不同:finally 用于異常處理后資源清理,finalize 是廢棄的垃圾回收回調(diào)方法,三者功能和用途截然不同。
在 Java 的世界里,final 關(guān)鍵字就像一個(gè)承諾,一旦做出,便不可更改。它是一個(gè)非訪問(wèn)修飾符,主要用來(lái)聲明變量、方法和類(lèi),其核心作用就是確保“最終性”——讓被修飾的實(shí)體變得不可變、不可覆蓋或不可繼承。簡(jiǎn)單來(lái)說(shuō),它賦予了代碼一種確定性,使得某些設(shè)計(jì)意圖得以固化,從而提升程序的健壯性、可預(yù)測(cè)性和安全性。
final 關(guān)鍵字在 Java 中有著明確且重要的用途,它能夠應(yīng)用于變量、方法和類(lèi),每種應(yīng)用場(chǎng)景都賦予了被修飾元素特定的“不變性”或“終結(jié)性”。
應(yīng)用于變量時(shí),final 變量一旦被賦值,其值就不能再被改變。對(duì)于基本數(shù)據(jù)類(lèi)型,這意味著變量存儲(chǔ)的數(shù)值本身是常量。而對(duì)于對(duì)象引用類(lèi)型,final 確保的是這個(gè)引用本身不能再指向其他對(duì)象,但被引用的對(duì)象內(nèi)部的狀態(tài)(如果對(duì)象是可變的)仍然是可以改變的。這種特性常用于定義常量,或在多線(xiàn)程環(huán)境中確保某個(gè)引用不會(huì)被意外修改。
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
應(yīng)用于方法時(shí),final 方法意味著該方法不能被任何子類(lèi)重寫(xiě)(override)。這在設(shè)計(jì)框架或庫(kù)時(shí)非常有用,可以確保某些核心邏輯或安全敏感操作的行為是固定的,不被子類(lèi)隨意篡改。它也常用于確保父類(lèi)定義的特定行為在整個(gè)繼承體系中保持一致性。
應(yīng)用于類(lèi)時(shí),final 類(lèi)表示該類(lèi)不能被任何其他類(lèi)繼承。這通常用于創(chuàng)建不可變類(lèi)(如 String 類(lèi)),或者出于安全考慮,防止子類(lèi)修改或擴(kuò)展其行為。當(dāng)一個(gè)類(lèi)被聲明為 final 后,它的設(shè)計(jì)就被認(rèn)為是完整的,不需要也不允許再進(jìn)行擴(kuò)展。
這確實(shí)是初學(xué)者常會(huì)感到困惑的一個(gè)點(diǎn),也是 final 變量最需要細(xì)致理解的地方。說(shuō)白了,final 變量的“不可變”是針對(duì)其直接存儲(chǔ)的內(nèi)容而言的。
對(duì)于基本數(shù)據(jù)類(lèi)型(如 int, double, boolean 等),final 關(guān)鍵字直接作用于變量所存儲(chǔ)的那個(gè)值。一旦賦值,這個(gè)值就固定了,你不能再給它賦新值。
final int MAX_ATTEMPTS = 3; // MAX_ATTEMPTS = 4; // 編譯錯(cuò)誤:無(wú)法為最終變量 MAX_ATTEMPTS 分配值
而對(duì)于對(duì)象引用類(lèi)型,final 關(guān)鍵字修飾的是引用本身。這意味著這個(gè)引用一旦指向了某個(gè)對(duì)象,它就不能再指向其他任何對(duì)象了。但是,被這個(gè) final 引用所指向的對(duì)象內(nèi)部的狀態(tài),如果這個(gè)對(duì)象本身是可變的(mutable),那么它的狀態(tài)仍然是可以改變的。
final StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 這是允許的,改變的是 StringBuilder 對(duì)象內(nèi)部的狀態(tài) System.out.println(sb.toString()); // 輸出:Hello World // sb = new StringBuilder("New"); // 編譯錯(cuò)誤:無(wú)法為最終變量 sb 分配值,因?yàn)橐貌荒芨淖?/pre>登錄后復(fù)制
所以,關(guān)鍵在于區(qū)分“引用不可變”和“被引用對(duì)象不可變”。如果你想要一個(gè)真正不可變的對(duì)象,你需要確保它的類(lèi)本身就是不可變的(比如 String 類(lèi),它的內(nèi)部狀態(tài)一旦創(chuàng)建就不能改變),或者在設(shè)計(jì)自己的類(lèi)時(shí),讓所有字段都是 final 并且它們引用的對(duì)象也都是不可變的。這其實(shí)是個(gè)挺有意思的設(shè)計(jì)哲學(xué),在并發(fā)編程中尤其重要,因?yàn)椴豢勺儗?duì)象天生就是線(xiàn)程安全的。
聲明方法或類(lèi)為 final,通常是出于設(shè)計(jì)意圖、安全性或性能(雖然性能提升在現(xiàn)代JVM中已不那么顯著)的考慮。
對(duì)于 final 方法:
對(duì)于 final 類(lèi):
這三個(gè)詞在 Java 中雖然拼寫(xiě)相似,但它們的作用、歸屬和設(shè)計(jì)意圖完全不同,是初學(xué)者常常混淆的另一個(gè)“陷阱”。
final:
finally:
try { // 可能會(huì)拋出異常的代碼 int result = 10 / 0; } catch (ArithmeticException e) { System.out.println("捕獲到異常:" + e.getMessage()); } finally { System.out.println("finally 塊執(zhí)行,無(wú)論是否發(fā)生異常。"); // 資源清理代碼 }
finalize:
class MyResource { // ... 資源相關(guān)代碼 @Override protected void finalize() throws Throwable { try { System.out.println("MyResource 對(duì)象正在被回收,執(zhí)行 finalize。"); // 清理資源,如關(guān)閉文件句柄 } finally { super.finalize(); // 總是調(diào)用父類(lèi)的 finalize } } }
請(qǐng)務(wù)必記住,不要在生產(chǎn)代碼中依賴(lài) finalize 方法進(jìn)行資源清理。
這三者雖然名字相似,但功能上是完全獨(dú)立的,分別服務(wù)于 Java 語(yǔ)言中不同的設(shè)計(jì)目標(biāo):final 關(guān)乎“不變性”和“終結(jié)性”,finally 關(guān)乎“資源管理”和“異常處理流程”,而 finalize 則是一個(gè)被廢棄的“垃圾回收回調(diào)”。理解它們的區(qū)別,是掌握 Java 語(yǔ)言深層機(jī)制的關(guān)鍵一步。
以上就是final 在java 中有什么作用?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
java怎么學(xué)習(xí)?java怎么入門(mén)?java在哪學(xué)?java怎么學(xué)才快?不用擔(dān)心,這里為大家提供了java速學(xué)教程(入門(mén)到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)