别被final、finally和finalize这三兄弟给骗了,其实它们半毛钱关系也没有

引言

final、finally和finalize的区别_大括号

最近小马云在网上火了,马云凭空多出来一个儿子,也真够衰的,哈哈。我还真百度搜了一下马云的真儿子,叫马元坤;估计比较低调,不像王思聪深怕没人知道他老爸就是王健林。这娃一看就是一枚小鲜肉,还好长得一点都不像他老爸,不然肯定会误认为是“孙悟空转世”。

final、finally和finalize的区别_异常处理_02

还是回过头来,看一下我们Java的这三个假兄弟final、finally和finalize。你别说,他们三个看起来还真像,不把眼睛睁大点还真分辨不出来。难怪在Java面试时,面试官就喜欢拿来糊弄我们这些Java菜鸟。

你老说它们半毛钱关系也没有,那么他们究竟是哪里来的?别着急!我们马上就让这三兄弟各回各家,各找各妈。

final

如果你不想让自己写的类被继承,那么就该 final 修饰符出场了。将final修饰符放到class关键字前,就表示定义的类不能被继承,那么定义的这个类我习惯叫太监类;为什么叫太监类,你懂的哈。

final、finally和finalize的区别_大括号_03

那有哪些类是太监类呀?String就是一个被final修饰的类,我们只能用,不能继承。

finally

finally 是在 Java 的异常处理中使用。啊,不知道什么是异常处理。简单说就是代码运行出错后的补救措施。你敢不敢写int i = 1 / 0;这句代码, 如果编译运行这行代码就会出现除数为0的异常错误。如果程序猿没有写处理异常的代码,那么这个异常错误就会最终被JVM(Java虚拟机)捕获到,那么后果就是程序执行终止。Java的异常处理是机制如下:

final、finally和finalize的区别_修饰符_04

我们可以看到 finally 的作用就是其大括号里包含的代码不管有没有异常都要执行。如果你肯动脑经也许会问,如果我在try的大括号里写上return,那finally里的代码还会执行吗?记住,finally不管任何情况下都会执行大括号里包含的代码。不信邪呀,你就试一试。

finalize

作为一名 Java 菜鸟估计你是很难有机会遇到它。还是给大家解释一下,这玩意儿是干嘛的。大家都知道 Java 有GC(自动垃圾回收),所以我们只管new对象,不用担心释放对象。当然,学C++的同学就没有这种福利了,C++菜鸟一不小心就可能搞出一个内存泄漏来。

final、finally和finalize的区别_异常处理_05

看到了吧,finalize其实是一个方法名,它是在Java的祖宗类Object中定义的,所以所有的类都自动继承这个方法。finalize()方法是在GC释放对象时被自动调用,常用于释放一些GC无法释放的资源。啊,还有GC无法释放的资源。当然有呀,GC可不是万能的哦。

总算把final、finally和finalize介绍完了,渴死了,先喝口水。大家现在应该不会被他们骗到了吧。其他它们是不会骗人的,只是被人利用了,是谁呀,还有谁,Java门神-面试官。

注:文章中涉及到异常处理、GC垃圾回收,如果不太了解的同学可以看一下我的相关博客文章。

作者:Binge
本文版权归作者有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。