zoukankan      html  css  js  c++  java
  • final、finally、 finalize 有什么不同

            感觉这三者除了长得像也没啥可作为比较的,但是面试题中经常会出现这三者的比较,就简单总结一下。

            1.final

      final 可以用来修饰类、方法和变量,修饰类的时候表示类是不可以被继承的,修饰方法的时候表示方法不可以被重写,修饰变量的时候表示变量不可以被更改

      一般情况下,我们把方法或者类声明成final的时候就是为了告诉人们,这些行为不可以被更改,这在某种程度上也能够保证平台的安全性。能够有效的避免API的使用者修改一些特定的值。

      下面的一段代码中,final 只能约束 strList 这个引用不可以被赋值,但是这个对象的行为却不会受到影响。

     final List<String> strList = new ArrayList<>();
     strList.add("Hello");
     strList.add("world");  
     List<String> unmodifiableStrList = List.of("hello", "world");
     unmodifiableStrList.add("again");

      上面两行代码运行不会报错,运行结果为:

      但是List.of()方法创建的是不可变的list,所以在add的时候会抛出异常。

      2.finally

      finally是java中为了保证重点代码一定被执行的一种机制。一般情况下,我们会使用try-fianlly,try-catch-finally来关闭流,关闭连接等操作。

      几个fianlly中的代码不会被执行的特殊情况:

    1. try-catch 异常退出。
    try{
        system.exit(1)
    }finally{
        System.out.println(123);
    }
    
    2. 无限循环
    try{
        while(ture){
            System.out.println(123);
        }
    }finally{
        System.out.println(456);
    }
    
    3. 线程被杀死
    当执行 tryfinally 的线程被杀死时。finally 也无法执行。
        

      fianlly在使用的过程中需要注意的就是:

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

      3.finalize 

      finalize 是基础类 java.lang.Object中的一个方法,用来回收资源,目的是为了保证对象在被垃圾回收之前完成特定资源的回收。但是在jdk9已经被标记deprecated了。也就是是说,这个方法并不推荐使用。之所以被废弃掉的原因在于不可控性,你无法控制finailize什么时候被执行,执行完成之后是否符合你的期望值。使用不当的话还有可能造成程序死锁,挂起等。

      finalize被设计成在资源回收集之前调用,这也就是意味着对象如果实现了这个方法,jvm就需要对他做额外的处理。这样看来finalize本质上成为了快速回收的阻碍者,很可能会导致你的对象会经过好几个垃圾回收集才能被回收,而垃圾回收集的时间不可预测,这样会导致大量的资源被占用,消耗掉许多高频的资源。

      那么与其使用finalize会导致系统性能下降,不如在资源使用完成之后显性释放掉或者利用资源池来进行复用

    唯有热爱方能抵御岁月漫长。
  • 相关阅读:
    linux里终端安转视频播放器的操作及显示
    String字符串操作
    普通类 抽象类 接口
    java基础
    关于window的端口查看及tomcat的端口修改问题
    eclipse的应用和整理
    mysql学习
    echarts的使用
    Failed to read candidate component class
    oracle学习笔记2
  • 原文地址:https://www.cnblogs.com/syq816/p/10077630.html
Copyright © 2011-2022 走看看