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

【大白话说Java面试题】【Java基础篇】第37题:final、finally、finalize的区别


📌专栏:大白话说Java面试题 — 01-Java基础篇

第37题:final、finally、finalize的区别

📚回答:

  • 核心对比
    finalfinallyfinalize是三个看似相似但功能完全不同的关键字或方法,它们在 Java 中的应用场景和作用各不相同。

1. final
  • 定义

    • final是一个修饰符,用于声明类、属性和方法。
    • :被final修饰的类不能被继承。
    • 属性:被final修饰的变量不可变(基本类型值不可更改,引用类型地址不可更改)。
    • 方法:被final修饰的方法不能被子类重写。

    💡代码示例
    以下代码展示了final的用法:

finalclassFinalClass{// 该类不能被继承}classExample{finalintMAX_VALUE=100;// 不可变变量finalvoiddisplay(){System.out.println("This method cannot be overridden");}}

2. finally
  • 定义

    • finally是异常处理机制的一部分,无论是否发生异常,finally块中的代码都会执行。
    • 常用于释放资源(如关闭文件流、数据库连接等)。
  • 注意事项

    • 如果在trycatch中调用了System.exit(0),则finally块不会执行。

    💡代码示例
    以下代码展示了finally的用法:

try{intresult=10/0;}catch(ArithmeticExceptione){System.out.println("除数不能为0");}finally{System.out.println("无论是否异常,都会执行");}

3. finalize
  • 定义

    • finalizeObject类中的一个方法,在垃圾回收器(GC)回收对象之前会调用该方法。
    • 主要用于清理资源(如关闭文件句柄、释放内存等)。
  • 注意事项

    • JVM 不保证finalize方法一定会被调用。
    • 从 Java 9 开始,finalize被标记为过时(Deprecated),推荐使用AutoCloseable接口(如try-with-resources)来管理资源。

    💡代码示例
    以下代码展示了finalize的用法:

classResource{@Overrideprotectedvoidfinalize()throwsThrowable{System.out.println("资源被释放");}}publicclassMain{publicstaticvoidmain(String[]args){Resourceresource=newResource();resource=null;// 断开引用System.gc();// 建议JVM进行垃圾回收}}

4. 对比总结
特性finalfinallyfinalize
用途修饰类、属性、方法异常处理中确保代码块一定会执行在 GC 回收对象前进行资源清理
可变性不可变总是执行不保证一定会执行
适用场景防止继承、重写或修改资源释放、善后处理过时,推荐使用try-with-resources

💡面试官视角

  • 面试官可能会问“finally是否一定会执行?”答:除非调用了System.exit(0)或 JVM 崩溃,否则finally块一定会执行。
  • 面试官可能会追问“为什么finalize被废弃?”答:因为finalize的执行时机不确定,可能导致资源延迟释放或未释放,推荐使用更可靠的资源管理方式(如try-with-resources)。
http://www.jsqmd.com/news/772624/

相关文章:

  • LuaDec51 完全指南:如何高效反编译 Lua 5.1 字节码的 3 大核心策略
  • Word安全防护:宏病毒与漏洞的攻防战
  • 深入StbM模块:从Time Base Status状态字节看AUTOSAR时间同步的健壮性设计
  • 别急着换手机!手把手教你给旧安卓(Android 5/6)装上最新版Termux,还能跑C程序
  • 如何在Obsidian中无缝嵌入B站视频:Media Extended插件完整教程
  • 如何用PE-bear轻松分析Windows可执行文件:3个实用技巧让你成为逆向分析高手
  • WeakAuras Companion技术架构深度解析:自动化同步机制与跨平台实现
  • 从GJB-5000A到5000B:2021新版软件能力成熟度模型,这5个实践域变化你必须知道
  • OpenHarmony 4.0开发板不息屏实战:DAYU/rk3568上三种修改方法详解(附代码)
  • 别再混淆了!图像处理中的4邻接、8邻接和m邻接,到底该怎么选?(附Python代码示例)
  • Python金融数据API终极指南:如何用Finnhub快速获取专业级市场数据
  • AISMM官方认证路径更新(附SITS2026自检清单V1.2·内部先行版)
  • 从零开始造显卡:一个让 Hacker News 沸腾的网页游戏教会我的事
  • 为Dify AI助手注入长期记忆:原理、部署与实战集成指南
  • d3dxSkinManage 技术解析:3DMigoto 皮肤 Mod 管理工具从部署到高级定制
  • AISMM模型核心五层架构解析,从理论到联盟共建落地的12个关键决策点
  • AISMM到底如何定义“智能服务水平”?3大颠覆性指标正在重写AI运维黄金法则
  • NVMe over Fabrics实战笔记:为什么RDMA和TCP传输都强制使用SGL?
  • redis竞态解决
  • 保姆级教程:用WindTerm 2.6.0高效管理Linux服务器(从SSH连接到文件传输)
  • 从验证到流片:聊聊DFT工程师如何用VCS和Verdi在RTL阶段就“排雷”
  • 保姆级教程:手把手配置AUTOSAR CAN网络管理状态机(附TJA1043/TJA1145收发器实战)
  • 免费开源视频压缩神器CompressO:3分钟学会如何将视频压缩90%以上
  • 别再让微服务请求链路成‘黑盒’!Spring Boot 3.x + Sleuth 保姆级集成与可视化实战
  • 亲测绍兴二手车:口碑品牌对比分享 - 花开富贵112
  • 从零到一:手把手教你用Yocto为i.MX8MM构建定制Linux系统(避坑指南)
  • 狭窄车位检测与自动垂直泊车路径规划混合A~*【附代码】
  • 保姆级教程:手把手教你用riscv-tests验证RISC-V指令集(附dump文件分析)
  • 观察使用 Taotoken 调用大模型进行数据处理的响应延迟与稳定性
  • 告别采集卡!用OBS NDI插件实现多机位无线串流(保姆级教程)