国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

final 在java 中有什么作用?

畫(huà)卷琴夢(mèng)
發(fā)布: 2025-07-16 08:50:02
原創(chuàng)
418人瀏覽過(guò)

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)方法,三者功能和用途截然不同。

final 在java 中有什么作用?

在 Java 的世界里,final 關(guān)鍵字就像一個(gè)承諾,一旦做出,便不可更改。它是一個(gè)非訪問(wèn)修飾符,主要用來(lái)聲明變量、方法和類(lèi),其核心作用就是確保“最終性”——讓被修飾的實(shí)體變得不可變、不可覆蓋或不可繼承。簡(jiǎn)單來(lái)說(shuō),它賦予了代碼一種確定性,使得某些設(shè)計(jì)意圖得以固化,從而提升程序的健壯性、可預(yù)測(cè)性和安全性。

final 在java 中有什么作用?

解決方案

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í)筆記(深入)”;

final 在java 中有什么作用?

應(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ò)展。

final 在java 中有什么作用?

final 變量:是值不可變還是引用不可變?

這確實(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 分配值
登錄后復(fù)制

而對(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?

聲明方法或類(lèi)為 final,通常是出于設(shè)計(jì)意圖、安全性或性能(雖然性能提升在現(xiàn)代JVM中已不那么顯著)的考慮。

對(duì)于 final 方法:

  1. 防止重寫(xiě),固化行為: 這是最直接的目的。當(dāng)一個(gè)方法被聲明為 final 時(shí),就明確告訴子類(lèi):“這個(gè)方法的行為是確定的,不要試圖改變它?!边@對(duì)于框架或庫(kù)的開(kāi)發(fā)者來(lái)說(shuō)非常關(guān)鍵,可以確保其核心算法或業(yè)務(wù)邏輯不被使用者意外或惡意地修改,從而維護(hù)系統(tǒng)的完整性和穩(wěn)定性。例如,在某些安全敏感的操作中,你絕對(duì)不希望它的行為被子類(lèi)篡改。
  2. 設(shè)計(jì)意圖的明確表達(dá): 它是一種設(shè)計(jì)上的“完成”信號(hào)。表示這個(gè)方法的功能已經(jīng)完善,不需要也不應(yīng)該被擴(kuò)展或修改。
  3. 微小的性能優(yōu)化: JVM 在運(yùn)行時(shí)可能會(huì)對(duì) final 方法進(jìn)行內(nèi)聯(lián)優(yōu)化,因?yàn)榫幾g器知道這個(gè)方法不會(huì)被重寫(xiě),調(diào)用路徑是確定的。但這在現(xiàn)代 JVM 中,智能優(yōu)化器通常能夠識(shí)別出哪些非 final 方法實(shí)際上也沒(méi)有被重寫(xiě),所以性能增益通常不是聲明 final 的主要驅(qū)動(dòng)力。

對(duì)于 final 類(lèi):

  1. 實(shí)現(xiàn)不可變性: 這是 final 類(lèi)最常見(jiàn)的用途之一。如果一個(gè)類(lèi)是 final 的,并且它的所有字段都是 final 的,同時(shí)確保這些字段引用的對(duì)象也是不可變的(或進(jìn)行防御性拷貝),那么這個(gè)類(lèi)的實(shí)例就是完全不可變的。String 類(lèi)就是最典型的例子。不可變對(duì)象在多線(xiàn)程環(huán)境中非常安全,因?yàn)樗鼈兊臓顟B(tài)不會(huì)改變,消除了競(jìng)態(tài)條件。
  2. 安全性考量: 阻止繼承可以防止惡意子類(lèi)通過(guò)重寫(xiě)方法來(lái)破壞父類(lèi)的核心功能或安全機(jī)制。例如,java.lang.System 類(lèi)就是 final 的,你無(wú)法繼承它并修改其行為。
  3. API 的穩(wěn)定性: 當(dāng)一個(gè)類(lèi)被聲明為 final 時(shí),意味著它的設(shè)計(jì)已經(jīng)成熟和穩(wěn)定,不打算再被繼承擴(kuò)展。這有助于維護(hù) API 的穩(wěn)定性和清晰性,避免未來(lái)因繼承而產(chǎn)生的兼容性問(wèn)題。
  4. 性能(同樣微小): 類(lèi)似于 final 方法,JVM 對(duì) final 類(lèi)也有一些優(yōu)化空間,因?yàn)樗啦粫?huì)有子類(lèi),可以簡(jiǎn)化某些方法調(diào)用的解析。

final 與 finally、finalize 有什么區(qū)別?

這三個(gè)詞在 Java 中雖然拼寫(xiě)相似,但它們的作用、歸屬和設(shè)計(jì)意圖完全不同,是初學(xué)者常常混淆的另一個(gè)“陷阱”。

  1. final

    • 作用: 是一個(gè)修飾符,用于聲明變量、方法和類(lèi),表示“最終的”、“不可變的”或“不可繼承的”。
    • 目的: 確保代碼的確定性、安全性、不變性或設(shè)計(jì)上的終結(jié)。
    • 例子: final int x = 10;, public final void myMethod() {}, public final class MyClass {}
  2. finally

    • 作用: 是 try-catch 語(yǔ)句塊中的一個(gè)伴隨關(guān)鍵字,用于定義一個(gè)代碼塊。
    • 目的: 無(wú)論 try 塊中是否發(fā)生異常,finally 塊中的代碼都保證會(huì)執(zhí)行。它通常用于釋放資源,比如關(guān)閉文件流、數(shù)據(jù)庫(kù)連接等,確保在任何情況下資源都能被正確清理。
    • 例子:
      try {
          // 可能會(huì)拋出異常的代碼
          int result = 10 / 0;
      } catch (ArithmeticException e) {
          System.out.println("捕獲到異常:" + e.getMessage());
      } finally {
          System.out.println("finally 塊執(zhí)行,無(wú)論是否發(fā)生異常。");
          // 資源清理代碼
      }
      登錄后復(fù)制
  3. finalize

    • 作用: 是 java.lang.Object 類(lèi)中定義的一個(gè)方法(protected void finalize() throws Throwable)。
    • 目的: 它是一個(gè)回調(diào)方法,由 Java 垃圾回收器(Garbage Collector, GC)在對(duì)象被回收之前嘗試性地調(diào)用。理論上,它用于執(zhí)行對(duì)象銷(xiāo)毀前的最后清理工作。
    • 重要提示: finalize() 方法在現(xiàn)代 Java 中已被強(qiáng)烈不推薦使用,甚至在 Java 9 中被標(biāo)記為廢棄(deprecated for removal),并在后續(xù)版本中可能被移除。 它的執(zhí)行時(shí)機(jī)不確定、無(wú)法保證,可能導(dǎo)致性能問(wèn)題、死鎖、資源泄露等一系列難以調(diào)試的復(fù)雜問(wèn)題。
    • 替代方案: 現(xiàn)代 Java 推薦使用 try-with-resources 語(yǔ)句(針對(duì)實(shí)現(xiàn)了 AutoCloseable 接口的資源)或顯式地在代碼中管理資源的生命周期(如在構(gòu)造函數(shù)中獲取資源,在 finally 塊中釋放)。
    • 例子(僅為說(shuō)明,不推薦使用):
      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
              }
          }
      }
      登錄后復(fù)制

      請(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é)教程(入門(mén)到精通)
java速學(xué)教程(入門(mén)到精通)

java怎么學(xué)習(xí)?java怎么入門(mén)?java在哪學(xué)?java怎么學(xué)才快?不用擔(dān)心,這里為大家提供了java速學(xué)教程(入門(mén)到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問(wèn)題
開(kāi)源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線(xiàn)php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)