final&&finally&&finalize
final/finally/finalize
关键词描述
-
final. 用于声明属性,对象,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
final声明对象表示的是对应的引用不可变,但是对象的值可以变,参照如下范例:
final StringBuffer buffer = new StringBuffer(); buffer.append("123");
-
finally 是异常处理语句结构的一部分,表示总是执行。
-
finalize:
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。如果必须保证采用特定的顺序,则必须提供自己的特有清理方法。一般实际的时候也不使用
关键字finally:
是异常处理语句结构的一部分,表示总是执行
-
finally对return的影响:
return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)-
范例1:
public class Step2Finally1 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(test()); } public static int test() { int num =10; try { System.out.println("try"); return num += 80; } catch (Exception ex) { System.out.println("error"); } finally { if (num > 20) { System.out.println("num < 20 :" +num); } System.out.println("finally"); } return num; } } // try // num < 20 :90 // finally // 90
-
范例2:
public class Step2Finally2 { public static void main(String[] args) { System.out.println(test()); } public static int test() { int num =10; try { System.out.println("try"); return num += 80; } catch (Exception ex) { System.out.println("error"); } finally { if (num > 20) { System.out.println("num < 20 :" +num); } System.out.println("finally"); return 100; } } } // try // num < 20 :90 // finally // 100
-
范例3:
public class Step2Finally3 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(test()); } public static int test() { int num =10; try { System.out.println("try"); return num ; } catch (Exception ex) { System.out.println("error"); } finally { if (num > 20) { System.out.println("num < 20 :" +num); } System.out.println("finally"); num = 100; } return num; } } // try // finally // 10
-
范例4:
public class Step2Finally4 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(test().num); } public static Num test() { Num number = new Num(); try { System.out.println("try"); return number ; } catch (Exception ex) { System.out.println("error"); } finally { if (number.num > 20) { System.out.println("number.num < 20 :" +number.num); } System.out.println("finally"); number.num = 100; } return number; } static class Num { public int num = 10; } } // try // finally // 100
-
finally与return总结
- 情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。
- 情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。
- 情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:
- 如果return的数据是基本数据类型,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
- 如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
finalize
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做的必要清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。