final

final是Java里面的一个关键字,可以用来修饰成员变量、局部变量、类、方法。

final修饰的类不能被继承,比方说String,Integer以及其他包装类。

final修饰的方法不能被重写。

final修饰的基本类型变量不可以被修改,修饰的其他类型变量的引用不能被修改。也就是说如果final int a=10,那么这个a变量以后就不能再给它赋值成别的值了。而修饰的非基本类型变量的话,该变量的引用指向的堆里面的内容是可以修改的,比如说:

final List<String> list = new ArrayList<String>();
list.add("item1");
list.add("item2");

上述操作是合法的。

final修饰的String类型再第一次赋值之后,也不能再重新赋值了,因为不管是采用下面哪种方式创建的String对象,如果再次赋值,该对象指向的引用就会变化。

final String string1 = new String("string1");
final String string2 = "string2";

另外,匿名内部类如果需要用到外面的局部变量,该变量必须是final类型。

final修饰局部变量时,局部变量必须在声明时就赋值。

没有在声明时初始化的final成员变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。

接口中的声明的变量始终都是 publis static final 类型的。

finally

finally用于在异常处理时处理一些收尾工作,比方说输入输出流、JDBC数据库连接打开后不管成功成功还是失败,都要将其关闭,释放资源。常用格式:

try{
  ......
}catch (Exception e){
  ......
}finally {
  ......
}

finalize

finalize是Object类中定义的方法,用于垃圾回收。Object类中该方法的定义如下:

protected void finalize() throws Throwable { }

当对某个对象垃圾收集确定没有更多引用时被垃圾收集器调用。子类重写finalize方法来处理系统资源或者做其他清理工作。

一般来说,finalize方法都是在Java虚拟机发现去除那些已经被执行了finalize的对象之外,没有任何活动的线程能够引用到该对象的时候调用。finalize方法可以做任何事情,包括使这个对象可以被其他进程访问;但是通常finalize的目的是在对象被真正回收之前做一些清理工作。例如,一个对象的finalize方法表示输入/输出连接可能在对象被永久回收前执行显式I/O事务来中断连接。

Object类的finalize方法不执行特别的操作,它只是简单地返回。Object子类可以重写这个方法。

Java编程语言不保证对于任何给定的对象哪个线程将调用finalize方法,但是它保证执行finalize的线程在调用finalize方法后不会一直保持任何用户可见的同步锁。如果finalize方法中抛出一个没有catch的异常,这个异常将会被忽略并且对象的finalize将终止。

在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

对于任何给定的对象,finalize最多被Java虚拟机执行一次。

finalize方法抛出的任何异常将导致这个对象的终结操作停止,但也会被忽略。(抛出异常后,该对象还是不可以继续操作,不会影响其他对象,直到被虚拟机回收)

建议尽量避免使用它,它不是C/C++中的析构函数,而是Java诞生时为了使c/c++程序员更容易接受它所做的一个妥协。它的运行代价高昂,不确定性大,无法保证各个对对象的调用顺序。虽然注释中描述它适合做“关闭外部资源”之类的工作,这完全是对这个方法用途的一种安慰,finalize()能做的所用工作,使用try-finally或者其他方式都可以做的更好,更及时。

参考资源

JDK 1.7 源码

Effective Java

http://www.importnew.com/7553.html

http://s1099.iteye.com/blog/1447714

http://www.xuebuyuan.com/813760.html

http://blog.csdn.net/cyp331203/article/details/44461021

http://www.debugease.com/j2se/820363.html

http://www.programgo.com/article/6855606134/