java中final、finally、finalized使用方法
首先需要明白 final和finally是关键字,finalize是一个方法。
1. final关键字
final可以修饰类、方法、变量,
- 修饰类表示类不可以被继承
- 修饰方法表示此方法不可以被重写(覆盖)但是可以被重载
- 修饰变量表示变量不可变(引用不可变--也就是不可以重新指向另一个对象,但是引用内容可以变),而且static final 经常用作常量处理。
package cn.qlq.fina; /** * final 关键字使用 * @author Administrator * */ public class TestCla { private static final int a = 1; private static final User u = new User();; public static void main(String[] args) { // a = 2;// final修饰的变量不可改变(引用不可变) // u=new User();//引用不可变,不可再指向其他对象,但是引用内容可以改变 u.setUsername("sssssss"); u.setUsername("XXXXXXX"); } public void test1(final int x ){ // x=1;//final修饰的变量不可改变,方法上的形参也不可以变 } }
2.finally的使用:---通常用于try..catch..之后关闭一些IO流等操作
-
try语句没有被执行,如在try语句之前就返回了,这样finally语句就不会执行;因此说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
-
如果在try代码块中执行System.exit(0)语句;那么将终止Java虚拟机JVM,因此,finally语句也不会被执行到。
-
finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中return已经确定的返回值,如果返回值类型为传址类型,则影响;传值类型,则不影响。若finally里也有return语句则覆盖try或catch中的return语句直接返回。
测试代码:
package cn.qlq.test; /** * * @author Administrator * */ public class MyTest { public static final int i = 6; @SuppressWarnings("finally") public static long test1() { String val = "5d"; long value = 5; try { value = Long.parseLong(val); } catch (NumberFormatException e) { System.out.println("catch..."); return value++; } finally { System.out.println("finally..."); value--; return value; } } public static void main(String[] args) { System.out.println(MyTest.test1()); } }
结果:
catch... finally... 5
3.finalize()析构方法的使用
finalize()在JVM回收对象的时候会调用该对象的此方法,用于垃圾回收的时候处理一些事情。
package cn.qlq.test; /** * * 测试finalize()方法,对象消亡的时候调用的方法,类似于C++的析构函数 * @author Administrator * */ public class MyTest { public static final int i = 6; @Override protected void finalize() throws Throwable { System.out.println("对象要死亡"); } @SuppressWarnings("finally") public long test1() { String val = "5d"; long value = 5; try { value = Long.parseLong(val); } catch (NumberFormatException e) { System.out.println("catch..."); return value++; }finally { System.out.println("finally..."); value--; return value; } } public static void main(String[] args) { MyTest my = new MyTest(); System.out.println(my.test1()); my = null;//清空对象的引用,使其被垃圾回收 System.gc();//调用GC回收垃圾 } }
结果:
catch...
finally...
5
对象要死亡
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】