finally关键字一般在程序中都是在try语句块中出现,目的是为了保证try语句块在正常或异常终止时都可以执行到我们需要执行的固定代码片段,比如打印日志,释放特定资源等。
正常的使用场景就不说了,直接看如下代码,你觉得结果是什么?
public class Test15 {
public static void main(String[] args) {
System.out.println("test1: "+test1());
System.out.println("test2: "+test2());
System.out.println("test3: "+test3().id);
}
private static int test1() {
try {
return 1;
} finally {
return 2;
}
}
private static int test2() {
int x = 1;
try {
return x;
} finally {
x = 2;
}
}
private static User test3() {
User user = new User();
try {
user.id=1;
return user;
}finally {
user.id=2;
}
}
static class User{
public int id;
}
}
执行结果如下:
在try...finally...语句块范围内:
1、return并不意味着方法的结束,return执行后,仍然会执行finally语句块;
2、return时,只是把值暂存到栈中,当finally中也有return时,会用新的值覆盖栈中的值,方法彻底结束后,返回栈中的值,;
对于test1方法来说,先return 1;将1暂存到栈中,然后finally再次return 2; 用2覆盖了原值,所以最后方法返回2;
对于test2方法来说,先return x;此时x的值为1,将1暂存到栈中,finally执行x=2,但是改变的只是x变量的值,不能改变栈中的值,所以最后返回1;
对于test3方法来说,return user;此时将user对象的地址暂存到栈中,finally执行user.id=2,改变了堆中对象的值,方法返回的是地址值,地址指向的对象的值被改变,所以最后结果是2;