这三个其实吊关系都没有
final 用来说明对象是不可变的,是无法被继承的
finally是保证代码必须要执行的一种机制,可以用来关闭资源等操作
finalize 是java.lang.Object的一种方法,是为了保证资源再被回收之前有一些额外的操作,但是在Jdk9之后已经被标记为Deprecated
final虽然说可以进行所谓的方法内联,改善JVM编译能力,但是呢,JVM相对来说是很智能,final字段对于性能的影响并不是很大,所以final主要的目的还是为了说明其语义,即改常量是不可变的
而且final和immutable是不一样的
final说明这个对象是不可以变的,但是对于对象内部的操作,是无法限制
如果需要所谓的不可以变性,需要
将class自身生命为final
并且将所有内部成员变量设置为final或者private
而且对于get的方法,做到copyonwrite
对于构造器,使用深拷贝做到和传参彻底的解耦
finally则是一个标准的语法,这个语法中常见的使用是对于关闭连接资源的操作,而且有try-with-resources语法糖,所以没有什么出格的问题
对于上面的代码可能是一个特例
从字节码的角度,直接跳出执行了
对于finalize,这是业界不推荐使用,而且在Java9中,也被标记为了废气,所以不建议使用进行资源回收,其主要原因是不知道什么时候finalize会执行,执行会不会导致思索
而且会导致拖慢垃圾回收,导致性能下降了40-50倍
而且finalize还会掩盖资源回收是的出错信息
那么有什么机制可以替换finalize吗
Java现在在推荐的是Cleaner机制来替换原有的finalize实现,实现了幻想引用,可以在这个机制里做一些资源回收的操作
而且有着自己的运行线程,避免了意外的死锁