1. final
final是用来修饰变量、方法和类的。被final修饰的变量不能被修改,被final修饰的方法不能被重写,被final修饰的类不能被继承。
2. finally
在异常处理中,finally在try-catch之后,无论是否捕获到异常一般都会执行finally里面的内容。finally中常用来执行一些最终的操作,像关闭一些资源的操作,比如流啊、数据库的链接啊等操作。
3. finalize
finalize是java.lang.Object类的一个方法,用于在对象被垃圾回收之前执行一些清理操作。这个方法被设计出来主要是为了被清理的对象从内存中彻底清除之前执行类似于关闭文件、数据库连接或释放其他资源等。
4. 最关键的玩法最多的要数finally,下面是对finally特点的一些介绍。
(1)finally中的代码一定会执行吗?
其实,正常情况下,finally中的代码是一定会被执行的,但是也存在一些特殊的情况:
- 程序正常退出:当在try或catch中调用了系统的System.exit()方法,并成功中止jvm的运行,则finally中的代码不会被执行。
- 线程终止:如果在执行try或catch时,当前线程中断,并且没有任何代码处理这个中断请求(如捕获InterruptedException),在java7及更早的版本中,如果线程直接停止,finally中的内容可能不会被执行。但是从java8开始,即使在try-catch-finally中线程中断,finally也会执行。
- 系统故障:当系统出现严重错误导致jvm出现致命错误无法继续执行时,finally中的内容无法执行。
总之,只要jvm没有被强制终止运行,并且没有遭遇到不可恢复的系统错误,finally中的代码就会被执行。
(2)try-catch-finally中包含return的情况?
其实主要就是分为以下两种情况。
- 当try-catch中包含return,但是finally中不包含时。
public static int i = 1;
public static void main(String[] args) {
int result = testFinally();
System.out.println(result);
System.out.println(i);
}
public static int testFinally(){
try {
int j = 1 / 0;
return i + 1;
} catch (Exception e) {
return i + 2;
} finally {
i += 3;
}
}
执行结果:
说明finally无论如何都会执行,catch中的代码执行后,把结果存到了result中,但是不管怎样finally中的代码都会执行,所以会最终执行i+=3,把i变成4。
- 当try-catch-finally中都包含return时。
public static int i = 1;
public static void main(String[] args) {
int result = testFinally();
System.out.println(result);
}
public static int testFinally(){
try {
int j = 1 / 0;
return i + 1;
} catch (Exception e) {
return i + 2;
} finally {
return i + 3;
}
}
在这个例子中try-catch-finally中都包含return,最终执行结果是:
说明都包含return时finally会覆盖上面的结果。而在获得最终结果的过程中,其实try-catch中的return都会执行,但是当执行到finally中的return时会将之前得到的结果覆盖。