您的位置:首页 > 编程语言 > Java开发

Java核心技术03 | final、finally、 finalize的不同

2019-03-10 16:35 281 查看
版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_40862011/article/details/88378019

基本定义

  1. final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的。
  2. finally则是java保证重点代码一定要被执行的一种机制,我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等动作。
  3. 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机制或其他替代方法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: