首先final, finally, finalize之间没有一点关系, 仅仅只是长得像!!!!
1. final关键字
- final表示不可修改的,可以用来修饰类, 方法, 常量;
- final修饰类class,表示该类class不能再派生出新的子类,不能作为父类被继承. 因此,一个类不能既被声明为abstract, 又被声明为final;
- final修饰方法,表示该方法只能被使用,不能被重写(override);
- final修饰一个变量, 表示该变量在使用过程中, 不可以被修改(被final修饰的变量即为常量)
- 常量的初始化方式:
- 在final变量定义时,直接给其赋值;
- 在构造器中
- 这两个地方只能任选其一, 不能同时赋值.
2. finally异常处理机制
finally是java的异常处理机制中的一部分,
finally块的作用就是为了保证无论出现什么情况, finally块里的代码一定会被执行.
一般来说在try-catch-finally 来进行类似关闭 JDBC连接,释放锁等资源的操作。
另外扩展一下,
如果try语句块里有return语句,那么finally还会被执行吗?答案是肯定的。
那么return都已经跳出方法体了,那finally应该是什么时候执行呢?
我的理解是在return中间执行。
例如:
public int test(){
int i=0;
try{
i=1;
//do
return i;
}catch(Exception e){
//
}finally{
i=2;
}
return i;
}
调用上面方法return返回的是1而不是2。
try里面遇到了return,jvm不会立刻return,它会把return后面的结果存起来,然后执行finally语句,注意return的是之前存起来的。也就是说如果在finally执行的语句是和return相关的,是不会被改变的。
3.finalize方法
finallize是Object类的一个方法, 是GC进行垃圾回收前要调用的一个方法.
- java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作. 这个方法是在垃圾收集器确定了被清理的对象没有被引用的情况下调用的.
- finalize是在Object类中定义的, 因此, 所有的类都继承了它. 子类可以覆盖finalize()方法, 来整理系统资源或者执行其他清理工作.
- 如果实现了非空的这个方法, 那么会导致相应对象回收呈现数量级上的变慢, 在新版JDK中(似乎是1.9之后的版本), 这个方法已经逐渐被抛弃了.