final、finally、finalize的区别

最近打算跳槽,读了一下极客时间的java核心技术36讲,感觉还不错,就此做个笔记(感兴趣的也可以点击购买链接http://stuq.com/a/100nJ,非广告推广)。本文所有内容,摘自https://time.geekbang.org/column/article/6906笔记,侵删

简要介绍

final:可以修饰类,方法,变量。修饰的类不能继承,方法不能重写,变量不能更改
finally:保证重点代码一定执行,经常用于try-catch语句,最后关闭连接等操作
finalize:保证对象被回收之前完成特定资源的回收,在java9中已经废弃掉了,因为无法保证它的执行时间,利用try-catch-finally是比较好的回收资源处理机制,如果还需要其他的,可以考虑使用cleaner

final

final修饰的对象不是Immutable(不可变对象),举个例子:

final List list = new ArrayList();
list.add("aa");
list.add("bb");
List immutableList = List.of("aa");
immutableList.add("bb")

final修饰的list只是引用,不被赋值。不会影响到对象的行为,而下面的immutableList,后面添加的"bb"不回被加入到集合当中。要想真正实现对象不可变要注意一下几点:
1.类要用final修饰
2.成员变量定义为private和final,而且不要实现setter方法
3.如果在构造函数中成员变量,要进行深度拷贝

finalize

finalize的执行适合垃圾收集关联在一起的,一旦实现了非空的finalize方法,就会导致相应对象回收程指数级变慢

finally

列几个 fianlly 不会被执行的情况:

  1. try-cach 异常退出。
    try{
    system.exit(1)
    }finally{
    print(abc)
    }

  2. 无限循环
    try{
    while(ture){
    print(abc)
    }
    }finally{
    print(abc)
    }

  3. 线程被杀死
    当执行 try,finally 的线程被杀死时。finally 也无法执行。

总结
1,不要在 finally 中使用 return 语句。
2,finally 总是执行,除非程序或者线程被中断。

你可能感兴趣的:(final、finally、finalize的区别)