第3讲 | 谈谈fnal、 fnally、 fnalize有什么不同?
- final可以用来修饰类、方法、变量,分别有不同的意义,
- final修饰的class代表不可以继承扩展,
- final的变量是不可以修改的,
- final的方法也是不可以重写的(override)。
- fnally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-fnally来进行类似关闭JDBC连接、保证unlock锁等动作。
- fnalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。 fnalize机制现在已经不推荐使用,并且在JDK 9开始被标记为deprecated。
什么机制可以替换fnalize?
Java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原有的fnalize实现
public class CleaningExample implements AutoCloseable {
// A cleaner, preferably one shared within a library
private satic fnal Cleaner cleaner = <cleaner>;
satic class State implements Runnable {
State(...) {
// initialize State needed for cleaning action
}
public void run() {
// cleanup action accessing State, executed at mos once
}
}
private fnal State;
private fnal Cleaner.Cleanable cleanable
public CleaningExample() {
this.sate = new State(...);
this.cleanable = cleaner.regiser(this, sate);
}
public void close() {
cleanable.clean();
}
}
实现AutoCloseable 重写close方法。
fanlly 不会被执行的情况
- try-cach 异常退出。
try{
system.exit(1)
}fnally{
print(abc)
}
- 无限循环
try{
while(ture){
print(abc)
}
}fnally{
print(abc)
}
- 线程被杀死
当执行 try, fnally 的线程被杀死时。 fnally 也无法执行。
总结
1 不要在 fnally 中使用 return 语句。
2 fnally 总是执行,除非程序或者线程被中断
参考:
极客时间:《Java核心技术面试精讲》
本笔记根据专栏主题进行学习笔记,虽然参考了许多做了笔记,但是加上了自己的整理,跟原作者的行文可能有很大偏差。如果想查看原版请自行搜索。谢谢