经典的基础题目:
谈谈final,finally,finalize有什么不同
考点分析:
这是一个非常经典的Java基础问题,回答的时候,除了对基础语法和用途回答之外,还可以有多方面的深入探讨。面试官还可以考你对性能,并发,对对象生命周期或者垃圾收集基本过程等方面的理解。
一、final
final是可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展;final修饰的变量是不可修改的;而final修饰的方法,也是不可以重写的(override)。同时,可以通过使用final关键字来明确代码语义以及逻辑意图。比如
1、将方法或者类声明为final,这样就可以明确告知别人,这些行为是不允许修改的。(也就是,这行代码,不准乱搞!),final的正确使用,可以有效避免API使用者更改基础功能,某种程度上,保证了平台或者项目的安全。
2、使用final修饰参数或者变量,也可以清楚地避免意外赋值导致地编程错误。
3、final变量产生了某种程度地不可变(immutable,但不等于immutable)的效果,可以用于保护只读数据,特别是在并发编程中,因为明确地不能再复制final变量,有利于减少额外地同步开销,也可以省去一些防御性拷贝的必要。
二、finally
finally则是Java保证重点代码一定被执行得一种机制。我们可以使用try-finally或者try-catch-finally来进行类似JDBC的链接,保证unlock等动作。不过,更推荐使用try-with-resource语句,能够更好地处理异常情况,编码量也少。另外还有个问题,看下面代码,会输出什么?
try{
//do something
System.exit(1);
}finally {
System.out.print("1111111");
}
上面finally的代码不会被执行哦。这是一个特例,谨记。
三、finalize
我们要明确它是不被推荐使用的,它不是一个好东西,在Java9中,甚至明确将它标记为deprfecated,没有特别原因,不要使用它,也不要指望它来进行资源回收。
为何?因为无法保证finalize什么时候执行,执行是否符合预期。使用不当是影响性能,导致程序死锁,挂起。
知识拓展:
1、注意,final不是immutable!
2、finalize真的那么不堪吗?
3、有什么机制可以替换finalize?
请关注我的公众号,查看结合Java面试题,深入理解Java(三),公众号不定期分享技术,以及我个人的学习笔记。