final、finalize、finally
final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
说明:final 声明的成员变量,必须在声明的同时赋值。final 声明的局部变量和普通的局部变量一样,可以在声明的同时不赋初值,但是在使用前必须赋值。
finalize 是Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
finally:return、continue和break都不能阻止finally语句块的执行
问题:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答案:在return之前,但往更细地说,是在return中间执行(可以在return语句处设置断点实验)。
eg1:
代码:
public class Test {
public static void main(String[] args) {
System.out.println(Test.test());
}
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
System.out.println(x);
}
}
}
结果:
2
1
分析:
主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。
所谓程序逻辑返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的!
eg2:
代码:
public final class FinallyTest {
public static ReturnClass testReturn() {
try {
return new ReturnClass();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("执行了finally语句");
}
return null;
}
public static void main(String[] args) {
FinallyTest.testReturn();
}
}
class ReturnClass {
public ReturnClass() {
System.out.println("执行了return语句");
}
}
结果:
执行了return语句
执行了finally语句
分析:
从输出的结果来看,return语句似乎在finally语句块之前执行了,事实真的如此吗?
我们来想想看,return语句的作用是什么呢?是退出当前的方法,并将值或对象返回。
如果finally语句块是在return语句之后执行的,那么return语句被执行后就已经退出当前方法了,finally语句块又如何能被执行呢?
因此,正确的执行顺序应该是这样的:
编译器在编译return newReturnClass();时,将它分成了两个步骤,new ReturnClass()和return,
前一个创建对象的语句是在finally语句块之前被执行的,而后一个return语句是在finally语句块之后执行的,也就是说finally语句块是在程序退出方法
之前被执行的。
同理,finally语句块是在循环被跳过(continue)和中断(break)之前被执行的。原文:http://blog.csdn.net/wodewutai17quiet/article/details/44005365