大体上讲,这三个词没啥联系,final是修饰字符,可定义变量,方法,类;finally是作为捕获异常后将要执行的操作放到它包含的区域;finalize则是与java的垃圾回收有关的方法。那么接下来我们就一一了解一下这三部分内容。
1.finalize()
跟大多数人一样,看到这个方法你很容易想到在java的垃圾回收中应用。在java编程思想中有这样的描述,java的垃圾回收器负责回收无用对象占据的内存资源,但也存在特殊情况:假定你的对象并非是使用java的关键词new获得的一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块特殊的内存。为了应对这样的情况,java允许在类中定义一个名为finalize()的方法。你可能会疑问,java中一切都是对象,对象占用的存储空间还有不通过new的吗?其实有,我们试想如果在java中调用非java语言如C语言的malloc()方法呢,如果这样不执行free()方法,对于这样的一块空间,垃圾回收器是不是就无法回收呢?
finalize()的工作原理可以理解为这样:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
然而java中的finalize()是区别C++中的析构函数的,因为在C++的析构函数一定会摧毁对象,释放内存的,而java中的对象却并不一定会被垃圾回收 。所以对于java的垃圾回收,我们要牢记三点:
a.java对象可能不被垃圾回收
b.垃圾回收类似析构但不等于析构
c.垃圾回收只做与内存有关的事情
简单点记忆就是,在finalize方法中做你想在java垃圾回收器执行垃圾回收时必须要做的清理工作。在JVM中,垃圾回收器采用"标记-回收"的原则,对需要清理的对象进行清理,详细的常用方法就不在这里谈了。
2.final关键字
java中final修饰的三种情况有数据,方法,类。
当某个类整体定义为final时,就表明了该类无法被继承,由于final类是禁止继承,所以final类中所有的方法都隐式指定为final的,这样无法覆盖该方法。
当某个方法被定义为final时,就表明了你想把方法锁定,防止任何继承类修改,这样做的另一个目的就是效率,final方法就是同意编译器将针对该方法的所有调用都转为内嵌调用。
当某个数据(常量,参数变量)被定义为final时,该数据(数值或者对象的引用)在运行中不可改变。不过final修饰的数据必须在定义时给定初始值。
3.finally
对于没有垃圾回收和析构函数自动调用机制的编程语言来说,finally就很重要了,把回收工作全部放到finally域中,内存总能释放。但对于java有垃圾回收机制而言,finally就是用在除内存之外的资源恢复工作上。