当前位置: 首页 > web >正文

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

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 {@Overrideprotected 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.xdnf.cn/news/1141.html

相关文章:

  • [Java] 泛型
  • Python 设计模式:享元模式
  • JVM虚拟机-类加载器、双亲委派模型、类装载的执行过程
  • 虚无隧穿产生宇宙(true nothing tunneling) 这个的真空是哪种
  • GitLab 提交权限校验脚本
  • 界面控件DevExpress WPF v25.1预览 - 支持Windows 11系统强调色
  • MuJoCo中的机器人状态获取
  • 第六篇:linux之解压缩、软件管理
  • Vue3集成sass
  • Unity 跳转资源商店,并打开特定应用
  • 滑动窗口学习
  • 【HTTPS协议原理】数据加密、如何防止中间人攻击、证书和签名、HTTPS完整工作流程
  • UnityDots学习(四)
  • 关于RPC
  • 图数据库nebula测试指南
  • 在 NVIDIA Orin (JetPack 6.0) 上安装 PyTorch 2.4 + Torchvision 0.19
  • 每日算法-250422
  • 几种Word转换PDF的常用方法
  • 如何在idea里创建注释模版
  • 真我推出首款 AI 翻译耳机,支持 32 种语言翻译
  • 拥抱健康生活,开启养生之旅
  • Android Jetpack Compose基础实践
  • iscsi服务端安装及配置
  • 【Python爬虫基础篇】--3.cookie和session
  • Office文档图片批量提取工具
  • 异构网络环境下的切换策略研究
  • 边缘计算全透视:架构、应用与未来图景
  • 基于Java+MySQL实现(Web)企业仓库存储管理系统
  • 金融数据分析(Python)个人学习笔记(12):网络爬虫
  • 【产品经理从0到1】用户研究和需求分析