[java基础问题] final、finally、 finalize
-
final、finally、 finalize
- final 用来修饰class,variable, function的关键字。修饰class时,代表类不可被继承;修饰variable时,代表标量不可修改(引用所指向的内存地址不可修改); 修饰function时,该方法不可重写(override);
- finally java中使用在try-finally 或者 try-catch-finally中,用来确保finally块内的代码一定会被执行,常用来关闭资源等;
- finalize 基础类 java.lang.Object 的一个方法,设计目的是保证对象在被垃圾收集前完成特定资源的回收。jdk9中被标记为deprecated(已丢弃)
-
知识扩展
- 使用final生命的变量只是当前引用地址不可变,如申明的是基本数据类型,则值不变。申明的是非基本数据类型时,对象的引用不可变,成员变量,等信息可以改变;
- finally确保总是执行,但是在异常退出时会不执行,例如:
try { // do something System.exit(1); } finally { System.out.println("This is finally"); }
- try-catch-finally中使用return的情况:
- 在执行第一个return之前没有抛出异常(包括在catch中存在return),则在执行return的前先执行finally后再执行return,此时在finally中无法改变return返回的值(引用的内存地址不可变);
- 如果在finally中使用return,会强制执行finally的return,在执行return之前catch的异常信息将会丢失,并且无法对异常进行处理try-catch中的return值会丢失;
- 建议使用try-with-resources机制来进行资源回收;
- finalize (已丢弃),原因是不发保证执行顺序与时间,并且实现了finallize的对象会被垃圾回收机制特殊处理,影响垃圾回收机制效率,甚至堆积一定程度后出现OOM;