考点分析
这是一个非常经典的 Java 基础问题,我上面的回答主要是从语法和使用实践角度出发的,其实
还有很多方面可以深入探讨,面试官还可以考察你对性能、并发、对象生命周期或垃圾收集基本
过程等方面的理解。
推荐使用 final 关键字来明确表示我们代码的语义、逻辑意图,这已经被证明在很多场景下是非
常好的实践,比如:
我们可以将方法或者类声明为 final,这样就可以明确告知别人,这些行为是不许修改的。
如果你关注过 Java 核心类库的定义或源码, 有没有发现 java.lang 包下面的很多类,相当一部
分都被声明成为 final class?在第三方类库的一些基础类中同样如此,这可以有效避免 API 使
用者更改基础功能,某种程度上,这是保证平台安全的必要手段。
使用 final 修饰参数或者变量,也可以清楚地避免意外赋值导致的编程错误,甚至,有人明确
推荐将所有方法参数、本地变量、成员变量声明成 final。
final 变量产生了某种程度的不可变(immutable)的效果,所以,可以用于保护只读数据,
尤其是在并发编程中,因为明确地不能再赋值 final 变量,有利于减少额外的同步开销,也可
以省去一些防御性拷贝的必要。
final 也许会有性能的好处,很多文章或者书籍中都介绍了可在特定场景提高性能,比如,利用
final 可能有助于 JVM 将方法进行内联,可以改善编译器进行条件编译的能力等等。坦白说,很
多类似的结论都是基于假设得出的,比如现代高性能 JVM(如 HotSpot)判断内联未必依赖
final 的提示,要相信 JVM 还是非常智能的。类似的,final 字段对性能的影响,大部分情况
下,并没有考虑的必要。
从开发实践的角度,我不想过度强调这一点,这是和 JVM 的实现很相关的,未经验证比较难以
把握。我的建议是,在日常开发中,除非有特别考虑,不然最好不要指望这种小技巧带来的所谓
性能好处,程序最好是体现它的语义目的。如果你确实对这方面有兴趣,可以查阅相关资料,我
就不再赘述了,不过千万别忘了验证一下。
对于 finally,明确知道怎么使用就足够了。需要关闭的连接等资源,更推荐使用 Java 7 中添加
的 try-with-resources 语句,因为通常 Java 平台能够更好地处理异常情况,编码量也要少很
多,何乐而不为呢。
另外,我注意到有一些常被考到的 finally 问题(也比较偏门),至少需要了解一下。比如,下
面代码会输出什么?
评论0
最新资源