• 40 final、finally、finalize的区别


    1、final

      用于声明属性、方法、类。分别表示属性不可被改变,方法不可被覆盖,类不可被继承。

      (1)一个类不能既被声明为abstract的,又被声明为final的。

      (2)被声明为final的变量必须在声明时给定初值。一般,成员变量有默认值,但是如果是final的成员变量就没有默认值,必须赋初值。

      (3)内部类要访问方法局部变量,局部变量必须定义为final类型。方法中的final局部变量放在堆中,而非栈中。

      (如果局部变量不被标注为final,那么就意味着我们可以随时修改它的值。假设我们在创建了对象后修改了局部变量的值,那么这时我们的内部类所看到的局部变量的值还是之前通过构造函数传递进去的老值,这样就导致内部类和外部函数对该局部变量的值“认识”的不一致。所以final关键字的目的就是为了保证内部类和外部函数对变量“认识”的一致性。)   

    2、finally

      在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 

      完整的异常处理语句一定要包含finally,finally是总会执行的语句。除非以下四种特殊情况发生,finally才不会执行:

    (1)在finally语句块中发生了异常

    (2)在前面代码中用了System.exit()退出程序

    (3)程序所在的线程死亡

    (4)关闭CPU

    注意:前面的代码中就算有return语句,finally还是会执行!

    3、finalize

      Object类的一个方法,因此所有的类都继承了它。

      垃圾收集器执行时会调用被回收对象的此方法。使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 不保证此方法总被执行。

  • 相关阅读:
    [LeetCode-JAVA] Count Complete Tree Nodes
    [LeetCode-JAVA] Shortest Palindrome
    [LeetCode-JAVA] Best Time to Buy and Sell Stock IV
    [LeetCode-JAVA] Word Ladder II
    [LeetCode-JAVA] Jump Game II
    Keil开发的ARM程序main函数之前的汇编分析
    STM32平台SD卡的FatFS文件系统开发
    STM32 Cortex-M3 NMI异常
    应对STM32 Cortex-M3 Hard Fault异常
    LwIP协议栈开发嵌入式网络的三种方法分析
  • 原文地址:https://www.cnblogs.com/seven7seven/p/3728665.html
Copyright © 2020-2023  润新知