Java final、finally、finalize三者的区别
一.final
- final可以修饰类、方法和变量。
- final修饰类表示不可以被继承,但是可以继承其他类。
- final修饰方法表示方法不可以被重写,但可以继承使用。
- final修饰变量表示此变量是一个常量。
二.finally
- finally作为异常处理的一部分,只能用在try-catch-finally中,表示其中的语句一定会被执行,经常被用在需要释放资源的情况下。
- 在某些特殊情况下,finally中的语句不一定会被执行,比如一个线程在执行try语句块或者catch语句块时被打断(interrupted)或者被终止(killed),与其相对应的finally语句块可能不会执行。还有更极端的情况,就是在线程运行try语句块或者catch语句块时,突然死机或者断电,finally语句块肯定不会执行。还有就是使用System.exit(0)终止JVM的运行,finally语句块肯定也不会执行。
三.finalize
- finalize()方法是在java.lang.Object里定义的,也就是说每个对象都有这个方法。这个方法在gc启动,对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),一般情况下不需要我们手动实现finalize()。
- 特殊情况下,需要我们实现finalize(),当对象被回收的时候需要释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize(),关闭这个链接。
- 一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法。