自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

農(nóng)行一 面:說(shuō)說(shuō) final,finally,finalize 的區(qū)別

開(kāi)發(fā) 后端
在 Java 中,final、finally和finalize是三個(gè)不同的關(guān)鍵字或方法,盡管它們的名字相似,但在功能和用途上卻有顯著的區(qū)別。

在 Java中,final、finally和finalize是三個(gè)不同的關(guān)鍵字或方法,盡管它們的名字相似,但在功能和用途上卻有顯著的區(qū)別,這篇文章我們繼續(xù)來(lái)分析一篇農(nóng)行面試題目:說(shuō)說(shuō) final、finally和finalize的區(qū)別。

final

final是一個(gè)保留關(guān)鍵字,用于修飾類(lèi)、方法和變量。在 Java 中,final 關(guān)鍵字的主要作用是限制,并且確保某些行為不會(huì)被改變。主要表現(xiàn)如下:

  • final變量:一旦被初始化就不能再被改變,即常量。當(dāng)聲明一個(gè)變量為final時(shí),必須在定義的時(shí)候進(jìn)行初始化,或者在構(gòu)造器中初始化,從而確保對(duì)應(yīng)的指針不會(huì)再指向其他對(duì)象。
  • final方法:不能被子類(lèi)重寫(xiě)(override)。這樣確保方法行為保持一致,不被子類(lèi)改變。
  • final類(lèi):不能被繼承。通過(guò)將整個(gè)類(lèi)聲明為final,防止其他類(lèi)從它繼承。例如,String類(lèi)就是一個(gè)final類(lèi),這樣可以保證字符串的不可變性。

下面給出幾個(gè) final的使用示例:

final變量:用于創(chuàng)建常量,在定義時(shí)必須初始化,減少錯(cuò)誤和提高易讀性:

final double PI = 3.14159;

final方法:確保方法的一致性和安全性,避免被子類(lèi)篡改:

public final void display() {
    System.out.println("This is a final method.");
}

final類(lèi):類(lèi)被聲明為 final,意味著這個(gè)類(lèi)不能被繼承。這確保了類(lèi)的實(shí)現(xiàn)不能被其他類(lèi)修改或擴(kuò)展。

public final class Constants {
    public static final String APP_NAME = "FinalDemoApp";
}

finally

finally 是 Java 中的一個(gè)關(guān)鍵字,主要用于異常處理結(jié)構(gòu)中。它通常與 try 和 catch 塊聯(lián)用,是異常處理機(jī)制中一個(gè)非常重要的部分。finally 的執(zhí)行是幾乎保證的,無(wú)論是否發(fā)生異常,即便在 try 塊中有 return、break 或者 continue 語(yǔ)句,finally 塊仍然會(huì)執(zhí)行。但有極少數(shù)情況下可能不會(huì)執(zhí)行,例如:

  • 如果在 try 或 catch 塊中調(diào)用了 System.exit() 方法,程序會(huì)退出,finally 塊不會(huì)執(zhí)行。
  • 如果 JVM 出現(xiàn)了故障,比如操作系統(tǒng)層面的崩潰,這些都是程序無(wú)法控制的情況。

使用場(chǎng)景

在實(shí)際處理異常時(shí),finally 塊用于保證一些重要的清理操作,例如關(guān)閉資源,釋放鎖等,通常用于處理以下 3種場(chǎng)景:

(1) 資源管理

在編程實(shí)踐中,資源(如文件、數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接等)的管理非常重要。finally 塊可以用來(lái)確保這些資源在使用后被正確關(guān)閉、釋放,避免資源泄漏。如下示例代碼:

FileInputStream fileInput = null;
try {
    fileInput = new FileInputStream("example.txt");
    // 處理文件
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fileInput != null) {
        try {
            fileInput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2) 恢復(fù)狀態(tài)

在異常處理過(guò)程中,系統(tǒng)可能會(huì)因?yàn)楫惓6幱谝环N不一致的狀態(tài)。finally 塊可以用來(lái)清理或者恢復(fù)這種狀態(tài),例如重置修改過(guò)的變量。如下示例代碼:

Lock lock = new ReentrantLock();
try {
    lock.lock();
    // 執(zhí)行一些可能拋出異常的操作
} finally {
    lock.unlock(); // 確保鎖總是會(huì)被釋放
}

(3) 清除事務(wù)

在事務(wù)處理中,無(wú)論事務(wù)是否成功,finally 塊可以用來(lái)保證事務(wù)的閉合或清理等后續(xù)操作。例如在數(shù)據(jù)庫(kù)事務(wù)中,確保連接關(guān)閉。如下示例代碼:

Connection conn = null;
try {
    conn = DriverManager.getConnection(DB_URL, USER, PASS);
    conn.setAutoCommit(false);
    // 執(zhí)行多步數(shù)據(jù)庫(kù)操作,可能拋出異常
    conn.commit(); // 提交事務(wù)
} catch (SQLException e) {
    if (conn != null) {
        try {
            conn.rollback(); // 回滾事務(wù)
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    e.printStackTrace();
} finally {
    try {
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

finalize

finalize() 是 JavaObject 類(lèi)的一個(gè)方法,它允許對(duì)象在被垃圾收集器回收之前執(zhí)行清理操作。盡管在早期的 Java 版本中,finalize() 方法被設(shè)計(jì)用于釋放對(duì)象所持有的非 Java 語(yǔ)言的資源,例如關(guān)閉文件或網(wǎng)絡(luò)連接,但是在現(xiàn)代 Java 開(kāi)發(fā)中,finalize() 已不再被推薦使用,其原因主要在于它的許多不確定性和低效性。Oracle 已建議開(kāi)發(fā)者使用其他方式進(jìn)行資源管理,尤其是在 Java 9 及以后版本中,finalize() 已被標(biāo)記為過(guò)時(shí)(deprecated)。

1.finalize() 的基本原理

(1) 垃圾回收機(jī)制:

  • 在 Java 中,垃圾回收器(Garbage Collector, GC)負(fù)責(zé)自動(dòng)回收不再被引用的對(duì)象以釋放內(nèi)存。
  • 當(dāng)垃圾回收器確定一個(gè)對(duì)象不再被引用時(shí),它會(huì)在該對(duì)象上調(diào)用 finalize() 方法,前提是該對(duì)象未被標(biāo)記為不可及狀態(tài)。

(2) 生命周期:

  • 該方法可以被重寫(xiě)用于執(zhí)行特定的清理任務(wù),比如釋放非托管資源。
  • finalize() 方法只會(huì)被調(diào)用一次,即便對(duì)象在 finalize() 方法中重新被引用,這個(gè)方法也不會(huì)被再次調(diào)用。

2.使用 finalize() 的問(wèn)題

不確定性:Java 的垃圾回收器無(wú)法保證 finalize() 方法會(huì)在對(duì)象死亡后立即執(zhí)行。執(zhí)行時(shí)間實(shí)際上是由 JVM 的垃圾收集來(lái)決定,這可能導(dǎo)致延遲清理和資源延遲釋放。

  • 性能問(wèn)題: 使用 finalize() 會(huì)增加 GC 的負(fù)擔(dān),因?yàn)閷?duì)象需要被多次標(biāo)記和遍歷,導(dǎo)致一定的性能開(kāi)銷(xiāo)。
  • 錯(cuò)誤處理: 如果 finalize() 方法拋出異常,GC 只會(huì)忽略,異常不會(huì)傳播,這會(huì)導(dǎo)致難以調(diào)試的問(wèn)題。
  • 無(wú)法保證調(diào)用: 在程序正常終止之前,不一定會(huì)觸發(fā) GC,因此無(wú)法保護(hù)重要資源的釋放。

使用示例:

public class MyClass {
  @Override
  protected void finalize() throws Throwable {
    // 執(zhí)行一些清理操作
  }
}

三者對(duì)比

控制級(jí)別:

  • final是編譯時(shí)屬性,用于類(lèi)設(shè)計(jì)和限制,避免繼承和重寫(xiě)。
  • finally是運(yùn)行時(shí)捕獲異常處理后的保障機(jī)制,用于資源管理。
  • finalize是執(zhí)行時(shí)的垃圾回收機(jī)制的一部分,但不再建議使用。

用途:

  • final用于提供不可變性、繼承控制、重寫(xiě)控制。
  • finally用于異常處理中的資源清理。
  • finalize過(guò)時(shí)的資源清理方法,替代為try-with-resources,try-with-resources極大提升了代碼的可讀性和可靠性。

總結(jié)

本文我們?cè)敿?xì)地分析了final、finally和finalize以及它們之間的對(duì)比,實(shí)際上它們之間沒(méi)有什么直接關(guān)聯(lián),只是單詞的前 5個(gè)字符相同,所以在很多面試題中,經(jīng)常把它們放在一起進(jìn)行對(duì)比。對(duì)于這 3個(gè)關(guān)鍵字或者方法的建議是:

  • 重點(diǎn)理解final關(guān)鍵字的使用
  • 重點(diǎn)掌握f(shuō)inally在異常處理中的使用
  • finalize方法已經(jīng)不再推薦,只需要了解
責(zé)任編輯:趙寧寧 來(lái)源: 猿java
相關(guān)推薦

2021-11-30 07:44:50

FinalFinallyFinalize

2021-12-10 12:01:37

finalfinallyfinalize

2023-07-28 07:18:39

final繼承結(jié)構(gòu)

2020-11-02 08:12:52

finalJava開(kāi)發(fā)

2022-08-15 08:34:08

OauthCAS登錄

2025-04-25 08:35:00

OAuth2權(quán)限驗(yàn)證開(kāi)發(fā)

2025-04-01 08:40:00

HTTPRPC開(kāi)發(fā)

2024-10-15 09:25:08

JDBCMybatis數(shù)據(jù)庫(kù)

2024-10-16 09:40:04

2021-03-27 10:56:17

promisethenfinally

2023-12-04 10:36:46

SessionCookie

2011-04-25 13:13:02

Javafinalize

2023-12-18 13:10:00

finally死鎖JVM 崩潰

2024-09-04 15:17:23

2021-09-30 07:57:13

排序算法面試

2021-11-27 08:13:13

Final 面試

2024-10-30 16:12:14

2021-10-15 09:53:12

工具

2009-09-07 10:37:32

C#執(zhí)行Finaliz

2021-04-29 08:28:24

架構(gòu)參數(shù)傳遞
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)