最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java中關(guān)鍵字final、finally、finalize的區(qū)別

 更新時(shí)間:2026年05月27日 08:37:34   作者:身如柳絮隨風(fēng)揚(yáng)  
final、finally、finalize?的區(qū)別?這三個(gè)?Java?關(guān)鍵字雖然拼寫相似,但功能完全不同,本文將從定義、使用場(chǎng)景、代碼示例、底層機(jī)制以及最佳實(shí)踐等多個(gè)維度,徹底講清這三者的差異,并附上流程圖和對(duì)比表格,助你一次搞懂

1. 引言

在 Java 面試中,有一個(gè)經(jīng)典問題頻繁出現(xiàn):“請(qǐng)說說 final、finally 和 finalize 的區(qū)別”。這三個(gè)關(guān)鍵字拼寫相似,但含義和作用截然不同。理解它們的區(qū)別,不僅有助于寫出更健壯的代碼,也是衡量 Java 基礎(chǔ)是否扎實(shí)的重要標(biāo)尺。

本文將從定義、使用場(chǎng)景、代碼示例、底層機(jī)制以及最佳實(shí)踐等多個(gè)維度,徹底講清這三者的差異,并附上流程圖和對(duì)比表格,助你一次搞懂。

2. 三者的核心區(qū)別速覽

關(guān)鍵字所屬范疇主要作用典型使用場(chǎng)景
final關(guān)鍵字/修飾符限制類、方法、變量不可變常量定義、防止繼承/重寫
finally異常處理塊無論是否異常,保證代碼執(zhí)行釋放資源(關(guān)閉文件、數(shù)據(jù)庫連接等)
finalizeObject 類方法對(duì)象被垃圾回收前調(diào)用(已過時(shí))對(duì)象臨終清理(不推薦)

3. final:不可變的守護(hù)者

final 是一個(gè)修飾符,可以用于修飾類、方法、變量。一旦被 final 修飾,其特性便“固定”下來。

3.1 final 修飾類

final 修飾的類不能被繼承。這通常用于那些設(shè)計(jì)上不允許擴(kuò)展的類,例如 String、Integer 等包裝類。

public final class Constants {
    // 類體
}

// 編譯錯(cuò)誤:無法繼承 final 類
// class MyConstants extends Constants { }

3.2 final 修飾方法

final 修飾的方法不能被重寫(Override)。這可以防止子類修改父類的關(guān)鍵行為。

class Parent {
    public final void doSomething() {
        System.out.println("Parent action");
    }
}

class Child extends Parent {
    // 編譯錯(cuò)誤:無法重寫 final 方法
    // public void doSomething() { }
}

3.3 final 修飾變量

  • 基本類型變量:一旦賦值,值不可改變,成為常量。
  • 引用類型變量:引用地址不可改變,但對(duì)象內(nèi)部狀態(tài)仍可修改。
  • 成員變量:必須在聲明時(shí)、構(gòu)造器或初始化塊中顯式賦值。
  • 局部變量:在使用前賦值即可,之后不可修改。
final int MAX_COUNT = 100;          // 常量
final List<String> list = new ArrayList<>();
list.add("hello");                  // ? 允許(對(duì)象內(nèi)容可變)
// list = new ArrayList<>();        // ? 編譯錯(cuò)誤,引用地址不可變

最佳實(shí)踐:使用 static final 定義真正的全局常量(命名全大寫、下劃線分隔)。

4. finally:保證執(zhí)行的最后防線

finally 是異常處理機(jī)制的一部分,與 trycatch 配合使用。它的特點(diǎn)是:無論 try 塊中是否發(fā)生異常,finally 塊中的代碼都會(huì)被執(zhí)行(除非 JVM 退出或當(dāng)前線程被中斷)。

4.1 基本語法

try {
    // 可能拋出異常的代碼
} catch (Exception e) {
    // 處理異常
} finally {
    // 一定會(huì)執(zhí)行的代碼,通常用于釋放資源
    // 例如:關(guān)閉文件流、數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接等
}

4.2 典型場(chǎng)景:資源釋放

FileInputStream fis = null;
try {
    fis = new FileInputStream("test.txt");
    // 讀取文件...
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:Java 7 引入了 try-with-resources,可以更優(yōu)雅地實(shí)現(xiàn)自動(dòng)資源釋放(要求資源類實(shí)現(xiàn) AutoCloseable)。但 finally 仍然是通用異常清理模式的基礎(chǔ)。

4.3 特殊情況

  • 如果 trycatch 中執(zhí)行了 System.exit(0),則 finally 不會(huì)執(zhí)行
  • 如果 finally 塊中拋出了未被處理的異常,它會(huì)覆蓋 trycatch 中拋出的原始異常。

5. finalize:被遺忘的臨終方法

finalize()java.lang.Object 類中定義的一個(gè) protected 方法。當(dāng)垃圾回收器(GC)確定某個(gè)對(duì)象“沒有引用”時(shí),會(huì)先調(diào)用該對(duì)象的 finalize() 方法(如果被重寫),然后再回收對(duì)象的內(nèi)存。

5.1 基本用法(已過時(shí))

public class MyResource {
    @Override
    protected void finalize() throws Throwable {
        try {
            // 釋放本地資源(如關(guān)閉文件句柄)
            System.out.println("finalize called");
        } finally {
            super.finalize();
        }
    }
}

5.2 為什么 finalize 已被標(biāo)記為廢棄(deprecated)?

問題說明
不確定性GC 何時(shí)調(diào)用 finalize() 不可預(yù)知,甚至永遠(yuǎn)不會(huì)被調(diào)用(如果對(duì)象永遠(yuǎn)不被 GC)。
性能開銷重寫 finalize() 會(huì)顯著增加 GC 開銷(對(duì)象需要兩次標(biāo)記)。
順序問題finalize() 執(zhí)行順序不受控制,可能導(dǎo)致資源訪問沖突。
替代方案使用 try-with-resources、Cleaner(Java 9+)或顯式資源管理方法(如 close())。

自 Java 9 起,finalize() 已被正式標(biāo)記為 deprecated(棄用),建議永遠(yuǎn)不要在新代碼中使用它。

5.3 對(duì)象死亡流程(含 finalize)

從流程圖可以看出,finalize() 甚至可能導(dǎo)致對(duì)象“復(fù)活”(在 finalize() 中重新將自己賦值給某個(gè)靜態(tài)變量),這是非常危險(xiǎn)的行為,也是它被棄用的原因之一。

6. 綜合對(duì)比與記憶口訣

6.1 對(duì)比表格

維度finalfinallyfinalize
類型關(guān)鍵字關(guān)鍵字方法名
所在包語言核心語言核心java.lang.Object
主要作用定義不可變性異常后清理對(duì)象臨終處理(已過時(shí))
可修飾目標(biāo)類、方法、變量代碼塊對(duì)象實(shí)例方法
是否推薦使用? 大量使用? 推薦? 強(qiáng)烈不推薦

6.2 記憶口訣

final 定終(終態(tài))身不二,finally 生死不離,finalize 來生難覓。

解釋:

  • final 鎖定類的繼承、方法的重寫、變量的改變。
  • finally 無論生死(異常與否)都會(huì)執(zhí)行。
  • finalize 被垃圾回收調(diào)用,但時(shí)機(jī)不定,如今已“難覓”蹤影。

7. 代碼示例:三者的協(xié)作

以下示例展示了在一個(gè)方法中同時(shí)使用 final 變量、finally 塊以及 finalize 方法(僅為演示,實(shí)際不推薦):

public class TestFinalFinallyFinalize {

    // final 常量
    private static final String MESSAGE = "Hello";

    public static void main(String[] args) {
        // final 局部變量
        final int times = 1;
        try {
            System.out.println(MESSAGE + " for " + times + " time");
            // 模擬異常
            // throw new RuntimeException();
        } finally {
            System.out.println("finally block: always executed");
        }
    }

    // 不推薦重寫 finalize
    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalize called (deprecated)");
        super.finalize();
    }
}

輸出(正常情況):

Hello for 1 time
finally block: always executed

finalize() 通常不會(huì)被調(diào)用,因?yàn)槌绦蛲顺鰰r(shí)對(duì)象可能不一定會(huì)被 GC。

8. 總結(jié)

  • final:不可變修飾符,用來定義常量、阻止繼承和重寫。
  • finally:異常處理中的保證執(zhí)行塊,用于釋放資源等清理工作。
  • finalize:已被廢棄的對(duì)象回收前回調(diào)方法,不要在新代碼中使用。

掌握這三者的區(qū)別,是 Java 基礎(chǔ)學(xué)習(xí)中的重要里程碑。最后提醒:如果你面試時(shí)被問到 finalize,最好能主動(dòng)說明它已被標(biāo)記為過時(shí),并推薦使用 try-with-resourcesCleaner 作為替代方案,這將展示你對(duì) Java 現(xiàn)代特性的了解。

到此這篇關(guān)于深入理解Java中關(guān)鍵字final、finally、finalize的區(qū)別的文章就介紹到這了,更多相關(guān)Java final finally finalize區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

民县| 平南县| 南康市| 邵阳县| 邛崃市| 新乐市| 洪洞县| 宝清县| 瑞安市| 赣州市| 盘锦市| 霍邱县| 布拖县| 左权县| 华池县| 遂昌县| 洪雅县| 客服| 梅州市| 屏边| 铁岭市| 博爱县| 灵台县| 新竹市| 潍坊市| 电白县| 贵南县| 红桥区| 武义县| 昭觉县| 郓城县| 淮安市| 莒南县| 宜州市| 巴中市| 浦县| 神农架林区| 吉首市| 远安县| 虎林市| 临汾市|