final,finally,finalize

final:

final修饰的类叫最终类,该类不能被继承。

final修饰的方法不能被重写。

final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

finally:

finally 则是 Java 保证重点代码一定要被执行的一种机制。通常的用法都是在 finally 里进行一些资源的关闭,回收。比如 IO 流的关闭等等。

finally 是用于异常处理的场面,无论是否有异常抛出,都会执行。

有在try块中执行不到finally的情况吗?

肯定是有,在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

try和finally中都有return语句,执行哪一个return?

try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 try 中的 return 语句先执行,finally 语句后执行,但try中的 return 并不是让函数马上返回结果,而是 return 语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回。但此时会出现两种情况:
① 如果finally中也有return,则会直接返回finally中的return结果,并终止程序,函数栈中的return不会被完成
② 如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中保存的try return的内容返回并终止程序

注意:

1、不管有没有出现异常,finally块中代码都会执行
2、当try和catch中有return时,finally仍然会执行
3、finally是在try中return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

finalize:

finalize是Object的方法,所有类都继承了该方法。 当一个对象满足垃圾回收的条件,并且被回收的时候,其finalize()方法就会被调用

finalize方法是Object提供的的实例方法,使用规则如下:

1)当对象不再被任何对象引用时,GC会调用该对象的finalize()方法
2)finalize()是Object的方法,子类可以覆盖这个方法来做一些系统资源的释放或者数据的清理
3)可以在finalize()让这个对象再次被引用,避免被GC回收;但是最常用的目的还是做cleanup
4)Java不保证这个finalize()一定被执行;但是保证调用finalize的线程没有持有任何user-visible同步锁。
5)在finalize里面抛出的异常会被忽略,同时方法终止。
6)当finalize被调用之后,JVM会再一次检测这个对象是否能被存活的线程访问得到,如果不是,则清除该对象。也就是finalize只能被调用一次;也就是说,覆盖了finalize方法的对象需要经过两个GC周期才能被清除。

参考 https://blog.csdn.net/mingc0758/article/details/81351009

原文地址:https://www.cnblogs.com/lhh666/p/11546353.html