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