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

简介: 小米,29岁程序员,分享Java面试中常见的final、finally、finalize区别。final确保不可变性,finally保证代码总会执行,finalize在对象被垃圾回收前做清理工作。通过故事讲解,帮助理解三者在Java资源管理中的不同角色。



大家好,我是小米,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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
3月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
52 1
|
5月前
|
Java
【Java基础面试三十九】、 finally是无条件执行的吗?
这篇文章解释了Java中的finally块的特性,即无论是否发生异常或执行了return语句,finally块都会无条件执行,除非使用System.exit()退出虚拟机。
|
7月前
|
Java 开发者
JAVA多线程初学者必看:为何选择继承Thread还是Runnable,这其中有何玄机?
【6月更文挑战第19天】在Java中创建线程,可选择继承Thread类或实现Runnable接口。继承Thread直接运行,但限制了多重继承;实现Runnable更灵活,允许多线程共享资源且利于代码组织。推荐实现Runnable接口,以保持类的继承灵活性和更好的资源管理。
80 2
|
7月前
|
Java C++ 开发者
线程创建的终极对决:Thread 类 VS Runnable 接口,你站哪边?
【6月更文挑战第19天】在Java多线程编程中,通过`Thread`类直接继承或实现`Runnable`接口创建线程各有优劣。`Thread`方式简洁但不灵活,受限于Java单继承;`Runnable`更灵活,适合资源共享和多接口实现,提高代码可维护性。选择取决于项目需求和设计原则,需权衡利弊。
89 1
|
8月前
|
Java
面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?
面试官:“小伙子,用过final关键字吗?” 我:“必须用过呀” 面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别” 我:“好嘞!
53 1
|
8月前
|
Java Linux API
Java多线程基础-4:详解Thread类及其基本用法 (一)
Java 中的 `Thread` 类是用来管理线程的,每个线程都是通过 `Thread` 类的对象来描述。
324 0
|
安全
synchronized工作过程中,具体讨论下synchronized里面都干了啥??
synchronized工作过程中,具体讨论下synchronized里面都干了啥??
47 0
|
调度
Thread 类的基本用法——一网打尽
Thread 类的基本用法——一网打尽
105 0
|
Serverless C语言 Python
学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?
在标准库inspect 中,它提供了两个自省的函数,即 ismethod() 和 isfunction(),可以用来判断什么是方法,什么是函数。
329 0
学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?
|
Java Unix 编译器
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(二)
final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。
165 0
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(二)

热门文章

最新文章