以下内容主要总结或摘录自《java编程思想》
final,finally,finalize其实是三个完全不同的概念,表格可以很清楚的看出。
final | finally | finalize |
---|---|---|
final用来修饰对象、方法或类,表示“不可改变的” | finally通常用于异常处理,表示无论异常是否被抛出,finally修饰的代码块总被执行 | finalize用于垃圾回收处理 |
keyword | block | method |
1. final
以下谈论了3种使用final的情况:数据、方法和类。
-
final数据
许多编程语言都有某种方法,来想编译器告知一块数据是恒定不变的:- 一个永不改变的编译时常量
- 一个在运行时被初始化的值,而你不希望它被改变
一个既是static有时final的域只占据一段不能改变的储存空间。
当对象引用而不是基本类型应用final时,其含义会有点令人迷惑。一旦引用被初始化指向某一个对象,就无法再把它改为指向拎一个对象,然而,对象其自身却是可以被修改的,java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果),这一特性同样适用于数组,它也是对象。 final方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义。过去建议使用final方法的第二个原因是效率,现在已经不需要使用final方法进行优化了。
final和private关键字
类中所有的private方法都隐式地指定为是final的。由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义。final类
当将某个类的整体定义为final时(通过将关键字final置于它的定义前),就表示你不打算继承该类,而且也不允许别人这样做。换句话说,你不希望它有子类。
final类中的任何方法也都隐式指定为final,因为禁止继承,所以也无法覆盖它们。
2. finally
finally的定义非常直接,无论异常是否被抛出,finally子句总能执行。
对于没有垃圾回收和析构函数自动调用机制的语言来说,finally非常重要。它能使程序员保证:无论try块里发生了什么,内存总能得到释放。但java有垃圾回收机制,所以内存释放不再是问题。而且,java也没有析构函数可以调用。那么java什么时候使用finally呢?
当要把除内存之外的资源恢复到它们的初始状态时,就要用到final子句。这种分需要清理的资源包括:已经打开的文件或网络连接,在屏幕上画的图形,甚至可以是外部世界的某个开关。
3. finalize
finalize方法书上写的比较隐晦,主要用于垃圾回收时使用,能得到的结论是,作为小菜鸟尽量不需要使用finalize,研究java垃圾回收机制时再去进行深入理解。