(十一)、final,finally,finalize的区别
首先,这三者一点关系都没有。
final
对于我们来说final是很基础的关键字。final可以用来修饰类、方法、变量。
1.final修饰的class,代表不可继承扩展。
2.final修饰的方法是不可以重写的。
3.final修饰的变量是不可以修改的。
这里所谓的不可修改对于基本类型来说,的确是不可以修改。而对于引用类型来说,只能说不能重新赋值,也就是不能改编引用地址。但是作为引用类型,它内部所包含的内容如果不是final则可以随意修改。
4.final声明的变量需要显示的给它赋初始值。如何赋值?直接赋值或在构造函数里赋值,对于编译的.class文件是等价的。
final int num; final int num2 = 666; public Test(){ num = 666; }
finally
finally 则是Java保证重点代码一定要被执行的一种机制。最常用的地方:通过try-catch-finally来进行类似资源释放、保证解锁等动作。
finally在try,catch中可以有,可以没有。如果trycatch中有finally则必须执行finally快中的操作。一般情况下,用于关闭文件的读写操作,或者是关闭数据库的连接等等。
try{ ... }catch(){ ... }finally{ ... }
这里提一点,try-finally也是可以的。不过这里个人不建议省略掉catch。
什么情况下finally不执行?当然是程序停止啊。
try{ System.exit(); }finally{ System.out.println("程序都死了,finally当然不执行了。") }
finalize
finalize这个是方法名。在java中,允许使用finalize()方法在垃圾收集器将对象从内存中清理出去之前做必要的清理工作。
说实话,我们日常开发中finalize用的并不多,而且也不被推荐使用。甚至在Java9中,明确将Object.finalize()标记为deprecated!
关于finalize说白了,它设计之初的作用就是:在CG要回收某个对象时,让这个对象有底气的大喊一声:“报告,我还能再抢救一下!”。但是也正是因为如此,JVM要对它进行额外处理。finalize也就成为了CG回收的阻碍者,也就会导致这个对象经过多个垃圾收集周期才能被回收。
参考文章:https://baijiahao.baidu.com/s?id=1611915475314303885&wfr=spider&for=pc