【Java面试笔记:基础】3.谈谈final、finally、 finalize有什么不同?

news2025/4/23 15:44:35

1. final、finally、finalize 的区别

final

用途:用于修饰类、方法和变量。
  • 修饰类:表示该类不能被继承。
final class ImmutableClass { 
    // 此类无法被其他类继承
}
  • 修饰方法:表示该方法不能被子类重写。
class Parent {
    final void method() { 
        // 子类无法重写此方法
    }
}
  • 修饰变量:表示该变量的值不能被修改。
final int MAX_VALUE = 100; // 基本类型常量
final List<String> list = new ArrayList<>(); // 引用类型常量(引用不可变,但对象内容可变)
特点:
  • 不可变性:final 修饰的变量在初始化后不能被重新赋值。
  • 性能优化:final 方法和变量可能被 JVM 优化,例如内联展开。
  • 线程安全:final 修饰的变量在多线程环境中可以减少同步开销。
实践建议:
  • 使用 final 修饰类和方法可以防止意外修改,增强代码的安全性。
  • 使用 final 修饰变量可以避免意外赋值,提高代码的可读性和维护性。

finally

  • 用途:用于确保在 try 块中的代码执行完毕后,无论是否发生异常,finally 块中的代码都会被执行。
    try {
        FileInputStream file = new FileInputStream("data.txt");
        // 操作文件
    } catch (IOException e) {
        System.out.println("文件读取异常");
    } finally {
        if (file != null) {
            file.close(); // 确保资源被释放
        }
    }
    
  • 特点:
    • 保证执行:finally 块中的代码在 try 块执行完毕后一定会被执行,即使发生异常、trycatch中有return语句。
    • 资源释放:常用于释放资源,如关闭文件流、数据库连接等。
  • 实践建议:
    • 使用 try-finallytry-catch-finally 结构来确保资源的正确释放。
    • finally 块中避免执行可能导致程序异常的代码,以免掩盖真正的异常。
    • Java 7+推荐使用try-with-resources替代finally手动关闭资源
    try (FileInputStream file = new FileInputStream("data.txt")) {
        // 自动关闭资源
    } catch (IOException e) {
        // 异常处理
    }
    

finalize

  • 用途:finalizeObject 类的一个方法,用于在对象被垃圾收集器回收前执行一些清理工作。
public class ResourceHolder {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("对象即将被回收");
        // 清理资源(如关闭未被释放的连接)
        super.finalize();
    }
}
  • 特点:
    不可预测性:finalize 的执行时间和顺序是不可预测的,依赖于垃圾收集器的行为。
    性能问题:实现finalize 方法的对象在垃圾收集时会增加额外的开销,可能导致性能下降。
    已废弃:从 JDK 9 开始,finalize 方法被标记为 @Deprecated,不推荐使用。
  • 实践建议:
    避免使用 finalize 方法进行资源回收,推荐使用 try-with-resourcesAutoCloseable 接口。
    如果确实需要在对象销毁时执行某些操作,可以考虑使用java.lang.ref.Cleaner机制。

2. 实践建议

  • 使用 final
    • 明确表示代码的语义和逻辑意图,避免意外修改。
    • 保护只读数据,减少线程同步开销。
    • 但不要过度依赖 final 带来的性能优化,现代 JVM 已经非常智能。
  • 使用 finally
    • 确保资源的正确释放,避免资源泄漏。
    • 推荐使用 try-with-resources 语句来简化资源管理。
  • 避免使用 finalize
    • finalize 存在性能问题和不可预测性,不推荐使用。
    • 使用 Cleaner 机制或其他替代方案进行资源回收。

3. 知识扩展

  • final 不是 immutable
    • final 只能约束变量的引用不被重新赋值,但对象本身的行为不受影响。
    • 如果需要实现不可变对象,需要确保类的成员变量是 private 和 final,并且实现深度拷贝。
  • finalize 的问题
    • finalize 的执行时间和顺序不可预测,可能导致资源泄漏和性能问题。
    • finalize 中的异常会被生吞,导致难以诊断的问题。
  • Cleaner 机制
    • Cleaner 利用幻象引用(PhantomReference)和引用队列实现资源回收,比 finalize 更可靠。
    • Cleaner 的操作是独立的,避免了 finalize 中的死锁问题。

4. 对比总结

特性finalfinallyfinalize
类型修饰符(关键字)代码块(关键字)方法(定义在Object类中)
作用定义不可变的类、方法或变量确保代码块在异常处理中始终执行在对象被回收前执行清理操作(不推荐使用)
使用场景常量定义、禁止继承或重写资源释放(如关闭文件、数据库连接)历史遗留的清理逻辑(实际应避免使用)
确定性编译时强制约束运行时保证执行执行时机由JVM决定,不可控
推荐实践广泛用于增强代码安全性优先用try-with-resources替代避免使用,改用显式资源管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结

以下是基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐&#xff0c;涵盖基础理论、模型架构、实战技巧及对比分析&#xff0c;并附表格总结&#xff1a; 1. 推荐书籍及内容说明 (1) 《深度学习》&#xff08;Deep Learning&#xff09; 作者&#xff1a;Ian Goodfellow…

从数字化到智能化,百度 SRE 数智免疫系统的演进和实践

1. 为什么 SRE 需要数智免疫系统&#xff1f; 2022 年 10 月&#xff0c;在 Gartner 公布的 2023 年十大战略技术趋势中提到了「数字免疫系统」的概念&#xff0c;旨在通过结合数据驱动的一系列手段来提高系统的弹性和稳定性。 在过去 2 年的时间里&#xff0c;百度基于该…

ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“

产生背景&#xff1a; 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止&#xff1a; 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释&#xff1a; 说明你当前运…

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程

进阶篇 第 5 篇&#xff1a;现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中&#xff0c;我们深入研究了经典的时间序列统计模型&#xff0c;如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛&#xff0c;但有…

影刀填写输入框(web) 时出错: Can not convert Array to String

环境&#xff1a; 影刀5.26.24 Win10专业版 问题描述&#xff1a; [错误来源]行12: 填写输入框(web) 执行 填写输入框(web) 时出错: Can not convert Array to String. 解决方案&#xff1a; 1. 检查变量内容 在填写输入框之前&#xff0c;打印BT和NR变量的值&#xff…

词语关系图谱模型

参数配置说明 sentences, # 分词后的语料&#xff08;列表嵌套列表&#xff09; vector_size100, # 每个词的向量维度 window5, # 词与上下文之间的最大距离&#xff08;滑动窗口大小&#xff09; min_count5, # 忽略出现次数小于5的…

HTTP的请求消息Request和响应消息Response

一&#xff1a;介绍 &#xff08;1&#xff09;定义 service方法里的两个参数 &#xff08;2)过程 Request:获取请求数据 浏览器发送http请求数据&#xff08;字符串&#xff09;&#xff0c;字符串被tomcat解析&#xff0c;解析后tomcat会将请求数据放入request对象 Response:…

C++异步操作 - future async package_task promise

异步 异步编程是一种程序设计范式&#xff0c;​​允许任务在等待耗时操作&#xff08;如I/O、网络请求&#xff09;时暂停执行&#xff0c;转而处理其他任务&#xff0c;待操作完成后自动恢复​​。其核心目标是​​避免阻塞主线程​​&#xff0c;提升程序的并发性和响应速度…

数据结构——栈以及相应的操作

栈(Stack) 在维基百科中是这样定义的&#xff1a; 堆栈(stack) 又称为栈或堆叠&#xff0c;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合中的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和…

如何应对政策变化导致的项目风险

应对政策变化导致的项目风险&#xff0c;核心在于&#xff1a;加强政策研判机制、建立动态应对流程、构建合规应急预案、强化跨部门联动、提升项目柔性与调整能力。其中&#xff0c;加强政策研判机制 是所有防范工作中的“前哨哨兵”&#xff0c;可以让项目团队在政策风向转变之…

ASP.Net Web Api如何更改URL

1.找到appsettings.json 修改如下&#xff1a; 主要为urls的修改填本机私有地址即可 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": &q…

【HTTPS协议原理】数据加密、如何防止中间人攻击、证书和签名、HTTPS完整工作流程

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux网络 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 数据加密常见的加密方式数据摘要方案一&#xff1a;仅使用对称加密方案二&#xff1a;仅使用非对称加密方案三&#xff1a;双…

Java中链表的深入了解及实现

一、链表 1.链表的概念 1.1链表是⼀种物理存储结构上⾮连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的 实际中链表的结构⾮常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 2.链表的实现 1.⽆头单向⾮循环链表实现 链表中的…

植物大战僵尸杂交版v3.6最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于4月19日更新了植物大战僵尸杂交版3.6版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/1af9b…

【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…

背包问题模板

文章目录 01背包题意思路代码优化 完全背包题意思路代码优化 多重背包题意思路代码优化 分组背包题意思路代码 01背包 特点&#xff1a;每件物品最多只能用一次 01背包问题 题意 给出每件物品的体积v,价值w,求解能装入背包的的物品的最大价值&#xff0c;并且每件物品只能选一…

Sentinel源码—8.限流算法和设计模式总结二

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 3.Sentinel使用的设计模式总结 (1)责任链模式 (2)监听器模式 (3)适配器模式 (4)模版方法模式 (5)策略模式 (6)观察者模式 (1)责任链模式 一.责任链接口ProcessorSlot 二.责…

VulnHub-DarkHole_1靶机渗透教程

VulnHub-DarkHole_1靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载&#xff1a;https://download.vulnhub.com/darkhole/DarkHole.zip 直接使用VMware打开就行 导入成功&#xff0c;打开虚拟机&#xff0c;到此虚拟机部署完成&#xff01; 注意&#xff1a…

边缘计算全透视:架构、应用与未来图景

边缘计算全透视&#xff1a;架构、应用与未来图景 一、产生背景二、本质三、特点&#xff08;一&#xff09;位置靠近数据源&#xff08;二&#xff09;分布式架构&#xff08;三&#xff09;实时性要求高 四、关键技术&#xff08;一&#xff09;硬件技术&#xff08;二&#…

MQ底层原理

RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件&#xff08;Message Broker&#xff09;&#xff0c;实现了 Advanced Message Queuing Protocol&#xff08;AMQP&#xff09;协议&#xff0c;可以帮助不同应⽤程序之间进⾏通信和数据交换。RabbitMQ 是由 E…