90%开发者都分不清!final、finally、finalize的终极区别揭秘

111 阅读3分钟



大家好,我是小米,29岁,热爱编程和分享的小太阳!最近有个朋友小王社招面试了Java开发岗,回来一脸懵圈跟我诉苦:

“面试官问我final、finally、finalize的区别,我竟然语无伦次!你说这仨到底有啥关系啊?就不能换点简单的问题吗?”

哈哈,其实这题还挺常见的!不少开发者刚接触Java时都容易混淆它们。为了不让更多人踩坑,今天小米带你通过一个故事彻底搞懂这三者的区别。

故事开头:Java村的三兄弟

从前有个Java村,住着三兄弟:finalfinallyfinalize。他们看起来名字很像,但性格却截然不同。

老大:final(终结的权威)

老大 final 是个很有原则的人,他的名言是:

“一旦决定,就再也不能改变!”

在Java里,final有三个主要用法:

1、修饰变量:让变量成为常量,值一旦赋予,就不能再改变。

2、修饰方法:禁止子类覆盖这个方法。

3、修饰类:不让任何类继承这个类。

所以,final是个坚定果敢的人,凡是他决定的,都是不可修改的!

老二:finally(后勤小能手)

老二 finally 是个热心肠,专门负责善后工作。他经常说:

“无论发生什么,我都得收拾残局!”

在Java中,finally常用于处理异常(exception)时的善后工作:

1、与try-catch配合:不管有没有异常,finally块的代码都会执行。

2、常见用途:比如关闭文件、释放数据库连接等资源。

3、注意:虽然finally几乎总会执行,但有一种特殊情况会打破规则——那就是System.exit()直接终止程序时,finally块的代码就不会执行了。

老三:finalize(孤独的收尾者)

最小的弟弟 finalize 有些孤僻,不常露面。他主要负责处理垃圾回收前的清理工作

1、属于Object类的方法: finalize是java.lang.Object类的方法,任何类都可以重写它。

2、触发时机:当垃圾回收器(GC)准备销毁一个对象时,会调用对象的finalize()方法,给予它最后的告别机会。

3、注意事项

  • finalize方法不可靠,因为垃圾回收器的运行时机无法预测。
  • Java 9开始,finalize()已被标记为过时方法,建议使用try-with-resources或显式关闭资源代替。

总结:三兄弟的不同之处

面试中的“小陷阱”

如果面试官问你:这三者有何共同点? 别慌!他们的名字虽相似,但并无直接关系。正确答案可以是:

  • 名字里都有"final"。
  • 都与Java语言的资源管理相关,但应用场景完全不同。

总结:牢记关键点

  • final: 是为了"不可改变";
  • finally: 是为了"总要执行";
  • finalize: 是为了"回收前清理"。

END

希望今天的分享能帮助大家彻底搞懂这道经典面试题!如果觉得有用,记得点赞+收藏+转发哦!

有其他Java问题也可以留言告诉我,小米随时在线,陪你一起成长~

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!