成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

農行一 面:說說 final,finally,finalize 的區別

開發 后端
在 Java 中,final、finally和finalize是三個不同的關鍵字或方法,盡管它們的名字相似,但在功能和用途上卻有顯著的區別。

在 Java中,final、finally和finalize是三個不同的關鍵字或方法,盡管它們的名字相似,但在功能和用途上卻有顯著的區別,這篇文章我們繼續來分析一篇農行面試題目:說說 final、finally和finalize的區別。

final

final是一個保留關鍵字,用于修飾類、方法和變量。在 Java 中,final 關鍵字的主要作用是限制,并且確保某些行為不會被改變。主要表現如下:

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

下面給出幾個 final的使用示例:

final變量:用于創建常量,在定義時必須初始化,減少錯誤和提高易讀性:

final double PI = 3.14159;

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

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

final類:類被聲明為 final,意味著這個類不能被繼承。這確保了類的實現不能被其他類修改或擴展。

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

finally

finally 是 Java 中的一個關鍵字,主要用于異常處理結構中。它通常與 try 和 catch 塊聯用,是異常處理機制中一個非常重要的部分。finally 的執行是幾乎保證的,無論是否發生異常,即便在 try 塊中有 return、break 或者 continue 語句,finally 塊仍然會執行。但有極少數情況下可能不會執行,例如:

  • 如果在 try 或 catch 塊中調用了 System.exit() 方法,程序會退出,finally 塊不會執行。
  • 如果 JVM 出現了故障,比如操作系統層面的崩潰,這些都是程序無法控制的情況。

使用場景

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

(1) 資源管理

在編程實踐中,資源(如文件、數據庫連接、網絡連接等)的管理非常重要。finally 塊可以用來確保這些資源在使用后被正確關閉、釋放,避免資源泄漏。如下示例代碼:

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) 恢復狀態

在異常處理過程中,系統可能會因為異常而處于一種不一致的狀態。finally 塊可以用來清理或者恢復這種狀態,例如重置修改過的變量。如下示例代碼:

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

(3) 清除事務

在事務處理中,無論事務是否成功,finally 塊可以用來保證事務的閉合或清理等后續操作。例如在數據庫事務中,確保連接關閉。如下示例代碼:

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

finalize

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

1.finalize() 的基本原理

(1) 垃圾回收機制:

  • 在 Java 中,垃圾回收器(Garbage Collector, GC)負責自動回收不再被引用的對象以釋放內存。
  • 當垃圾回收器確定一個對象不再被引用時,它會在該對象上調用 finalize() 方法,前提是該對象未被標記為不可及狀態。

(2) 生命周期:

  • 該方法可以被重寫用于執行特定的清理任務,比如釋放非托管資源。
  • finalize() 方法只會被調用一次,即便對象在 finalize() 方法中重新被引用,這個方法也不會被再次調用。

2.使用 finalize() 的問題

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

  • 性能問題: 使用 finalize() 會增加 GC 的負擔,因為對象需要被多次標記和遍歷,導致一定的性能開銷。
  • 錯誤處理: 如果 finalize() 方法拋出異常,GC 只會忽略,異常不會傳播,這會導致難以調試的問題。
  • 無法保證調用: 在程序正常終止之前,不一定會觸發 GC,因此無法保護重要資源的釋放。

使用示例:

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

三者對比

控制級別:

  • final是編譯時屬性,用于類設計和限制,避免繼承和重寫。
  • finally是運行時捕獲異常處理后的保障機制,用于資源管理。
  • finalize是執行時的垃圾回收機制的一部分,但不再建議使用。

用途:

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

總結

本文我們詳細地分析了final、finally和finalize以及它們之間的對比,實際上它們之間沒有什么直接關聯,只是單詞的前 5個字符相同,所以在很多面試題中,經常把它們放在一起進行對比。對于這 3個關鍵字或者方法的建議是:

  • 重點理解final關鍵字的使用
  • 重點掌握finally在異常處理中的使用
  • finalize方法已經不再推薦,只需要了解
責任編輯:趙寧寧 來源: 猿java
相關推薦

2021-12-10 12:01:37

finalfinallyfinalize

2021-11-30 07:44:50

FinalFinallyFinalize

2023-07-28 07:18:39

final繼承結構

2020-11-02 08:12:52

finalJava開發

2025-05-15 09:45:54

2022-08-15 08:34:08

OauthCAS登錄

2025-04-25 08:35:00

OAuth2權限驗證開發

2025-04-01 08:40:00

HTTPRPC開發

2024-10-15 09:25:08

JDBCMybatis數據庫

2024-10-16 09:40:04

2023-12-04 10:36:46

SessionCookie

2021-03-27 10:56:17

promisethenfinally

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

排序算法面試

2024-10-30 16:12:14

2021-10-15 09:53:12

工具

2021-11-27 08:13:13

Final 面試

2011-05-26 13:43:30

MongoDB
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠干综合视频 | 国产一区二区在线观看视频 | 一区二区免费 | 一区二区成人 | 欧美日韩综合 | 国外成人在线视频 | 亚洲国产精品成人无久久精品 | 九九久久久久久 | 免费在线观看一区二区 | 中文字幕在线视频免费观看 | 日韩欧美视频免费在线观看 | 日本a级大片 | 亚洲女人天堂成人av在线 | 欧美三级在线 | 男人的天堂中文字幕 | 999视频在线播放 | 日本成人在线免费视频 | 在线观看国产精品视频 | 天天干天天干 | 亚洲一区中文字幕 | 国产精品入口久久 | 日本三级网站在线观看 | 欧美爱爱视频网站 | 丁香五月网久久综合 | 国产观看 | 欧美电影免费网站 | 一级中国毛片 | 国产成人久久av免费高清密臂 | 日韩欧美一区二区在线播放 | 国产精品日韩一区 | 成人av在线网站 | 手机av在线 | 日韩欧美亚洲 | 国产一二区视频 | 久久久久黄色 | 国产激情综合五月久久 | 成人欧美一区二区三区色青冈 | 欧美国产日韩在线观看 | 国产欧美日韩在线 | 日韩在线小视频 | 国产欧美在线播放 |