谈谈final、finally、 finalize有什么不同

这个问题是我校招面试时遇到的一个问题,想想当时回答的并不够完善,最近听课学习,今天补充一下吧。

1.整体说一下
final可以用来修饰类、方法、变量,分别有不同的意义,fnal修饰的class代表不可以继承扩展,fnal的变量是不可以修改的,而fnal的方法也是不可以重写的(override)。
finally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-fnally或者try-catch-fnally来进行类似关闭JDBC连接、保证unlock锁等动作。
finalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。fnalize机制现在已经不推荐使用,并且在JDK 9开始被标记为deprecated。

2.细说一下

(1)final:表示我们代码的语义、逻辑意图,比如:我们可以将方法或者类声明为fnal,这样就可以明确告知别人,这些行为是不许修改的。java.lang包下面的很多类,相当一部分都被声明成为final class.在第三方类库的一些基础类中同样如此,这可以有效避免API使用者更改基础功能,某种程度上,这是保证平台安全的必要手段。
(2)finally,明确知道怎么使用就足够了。Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值。需要关闭的连接等资源,保证会执行

try {
// do something
Sysem.exit(1);
} fnally{
Sysem.out.println(“Print from fnally”);
}
一般我们普遍认为fnally中的程序无论无何都会被执行,但是存在特例:
当遇到exit()时,会直接退出程序,不会执行下边的finally中的语句。

(3)这个是我面试时只知道时垃圾回收的一种机制,面试官问我时只能说不清楚具体实现细节,今天好好补充一下:
finalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收如果没有特别的原因,不要实现fnalize方法,也不要指望利用它来进行资源回收。为什么呢?简单说,你无法保证fnalize什么时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。通常来说,利用上面的提到的try-with-resources或者try-fnally机制,是非常好的回收资源的办法。如果确实需要额外处理,可以考虑Java提供的Cleaner机制或者其他替代方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值