美文网首页
final、finally、finalize的区别

final、finally、finalize的区别

作者: 上官若枫 | 来源:发表于2018-07-31 18:07 被阅读68次

    最近打算跳槽,读了一下极客时间的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<String> list = new ArrayList();
    list.add("aa");
    list.add("bb");
    List<String> 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的区别

          本文链接:https://www.haomeiwen.com/subject/nhscvftx.html