Java核心技术03 | final、finally、 finalize的不同
基本定义
- final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的。
- finally则是java保证重点代码一定要被执行的一种机制,我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等动作。
- finalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize机制现在已经不推荐使用,并且在JDK9开始被标记为deprecated。
final
我们可以将方法或者类声明为final,这样就可以明确告知别人,这些行为是不许修改的。
使用final修饰参数或者变量,也可以清楚地避免意外复制导致的编程错误,甚至,有人明确推荐将所有方法参数、本地变量、成员变量声明成final。
final变量产生了某种程度的不可变(immutable)的效果,所以,可以用于保护只读数据,尤其是在并发编程中,因为明确地不能再复制final变量,有利于减少额外的同步开销,也可以省去一些防御性拷贝的必要。
finally
有一些比较偏门的finally问题,需要了解一下。
[code]try { // do something System.exit(1); } finally{ System.out.println(“Print from finally”); }
上面finally里面的代码不会被执行,这是一个特例。
[code]try{ while(ture){ print(abc) } }finally{ print(abc) }
无限循环finally不会被执行。
当执行try,finally的线程被杀死时,finally也无法执行。
finalize
对于finalize,我们要明确它是不推荐使用的,业界实践一再证明它不是个好的方法。在Java9中,甚至明确将 Object.finalize() 标记为 deprecated!如果没有特别的原因,不要实现 finalize 方法,也不要指望利用它来进行资源回收。
因为你无法保证finalize时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁,挂起等。
finalize被设计成在对象被垃圾收集前调用,这就意味着实现了finalize方法的对象是个“特殊公民”,JVM要对它进行额外处理,finalize本质上成为了快速回收的阻碍者,可能导致你的对象经过多个垃圾收集周期才能被回收。
因为finalize拖慢垃圾收集,导致大量对象堆积,也是一种典型的导致OOM的原因。
从另一个角度,我们要确保回收资源就是因为资源是有限的,垃圾收集时间的不可预测,可能会极大加剧资源占用。这意味着对于消耗非常高频的资源,千万不要指望finalize去承担资源释放的主要职责,况且它已经暴露了如此多的问题。因此推荐资源用完即显式释放,或者利用资源池来尽量重用。
通常来说,利用try-with-resources或者try-finally机制,是非常好的回收资源方法。如果需要额外处理,可以考虑java提供的Cleaner机制或其他替代方法。
- Java千百问_03基本语法(011)_final,finally,finalize有什么区别
- 03《Java核心技术36讲》之谈谈final、finally、 finalize有什么不同?
- java中final,finally,finalize三个关键字的区别
- Java中的final,finally,finalize的区别
- 说说Java中finally、final、finalize。
- java基础——final、finally、finalize区别
- java(instanceof操作符、对象类型转换 、final 关键字、final,finally,finalize的区别、static关键字,修饰符 )
- java基础知识1---面向对象及final,finally,finalize区别
- Java中final、finally、finalize的区别
- java中final、finally、finalize的区别
- Java 中 final、finally、finalize区别
- 浅析java中final,finally,finalize
- Java中final、finally和finalize的区别
- [好程序员]java基础笔记之final,finally,finalize的区分
- 主题:JAVA面试题解惑系列(四)——final、finally和finalize的区别
- java中的final, finally, finalize的区别
- <Java笔试面试题>final,finally,finalize()区别
- JAVA面试题解惑系列(四)——final、finally和finalize的区别
- final、finalize 和 finally 的不同之处
- [厉害了,我的JAVA基础](二)final, finally, finalize 的区别