热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

final/finally/finalize关键字对比

1.finalfinal意味着“最后的、最终的”含义,final可以用来修饰类,方法和变量(成员变量或局部变量)。1.1修

1. final

  final意味着“最后的、最终的”含义,final可以用来修饰类,方法和变量(成员变量或局部变量)。


1.1 修饰类

  当用final修饰类时,表明该类不能被其他类所继承。String是一个典型的final类型的类。

注意:final类中所有的成员方法都会隐式的定义为final方法。


1.2 修饰方法

把方法锁定,以防止继承类对其进行更改。如:枚举类中的equals()/clone()
此方法不能被重写,也不能在子类中重新定义同名同参的新方法


1.3 修饰变量

  final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。
  当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;
  如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的,即地址的值不发生变化。 
  final修饰一个成员变量(属性),必须要显示初始化。这里有三种初始化方式,一种是在变量声明的时候初始化;第二种方法是在代码块中赋值;第三种方法是在构造函数中对这个变量赋初值。
  final修饰一个方法形参,一旦调用该方法(传入了实参),该参数值就不能再修改。


2. finally

  finally是在处理异常时搭配try/catch语句使用,并且附带一个语句块,在服务正常运行的情况下finally语句块最终一定会被执行(不管有没有抛出异常),经常被用于释放资源。

注意:只有与finally对应的try语句块得到执行的情况下,finally语句块才一定会执行。

&#64;Testpublic void test(){List<String> list &#61; Arrays.asList("123", "12345", "1234", "4321", "1234567", "5678");//在执行try语句块之前就已经返回&#xff0c;finally不会执行
// if(list.size() &#61;&#61;6 ){
// return;
// }//在执行try语句块之前抛出异常&#xff0c;所以try对应的finally语句并没有执行。//int i &#61; 1/0;try {list.forEach(s -> {if (s.length() > 5) {//模拟出现异常throw new RuntimeException("foreach跳出循环");}System.out.println(s);});} catch (Exception e) {System.out.println("捕获异常" &#43; e.getMessage());}finally{System.out.println("finally语句块执行&#xff01;&#xff01;&#xff01;");}}

  当一个线程在执行 try 语句块或者 catch 语句块时被打断&#xff08;interrupted&#xff09;或者被终止&#xff08;killed&#xff09;&#xff0c;与其相对应的 finally 语句块可能不会执行。
  如果finally中有return语句,&#xff0c;且已经执行到了try代码块&#xff0c;则不会执行try/catch中的return语句&#xff1b;如果finally中没有return&#xff0c;则执行完finally块中的代码&#xff0c;再执行try/catch中的return语句。

public static void main(String[] args) {String s &#61; testFinallyReturn();System.out.println(s); //finally}public static String testFinallyReturn(){List<String> list &#61; Arrays.asList("123", "12345", "1234", "4321", "1234567", "5678");try {list.forEach(s -> {if (s.length() > 5) {//模拟出现异常throw new RuntimeException("foreach跳出循环");}System.out.println(s);});return "成功";} catch (Exception e) {System.out.println(e.getMessage());return "异常";}finally{System.out.println("finally语句块执行&#xff01;&#xff01;&#xff01;");//return "finally";}}


3. finalize

  finalize()是在java.lang.Object里定义的&#xff0c;也就是说每一个对象都有这么个方法。这个方法在gc启动&#xff0c;该对象被回收的时候被调用。其实gc可以回收大部分的对象&#xff08;凡是new出来的对象&#xff0c;gc都能搞定&#xff0c;一般情况下我们又不会用new以外的方式去创建对象&#xff09;&#xff0c;反射方式可以创建对象&#xff0c;所以一般是不需要程序员去实现finalize的。
  特殊情况下&#xff0c;需要程序员实现finalize&#xff0c;当对象被回收的时候释放一些资源&#xff0c;比如&#xff1a;一个socket链接&#xff0c;在对象初始化时创建&#xff0c;整个生命周期内有效&#xff0c;那么就需要实现finalize&#xff0c;关闭这个链接。
  使用finalize还需要注意一个事&#xff0c;调用super.finalize();
  一个对象的finalize()方法只会被调用一次&#xff0c;而且finalize()被调用不意味着gc会立即回收该对象&#xff0c;所以有可能调用finalize()后&#xff0c;该对象又不需要被回收了&#xff0c;然后到了真正要被回收的时候&#xff0c;因为前面调用过一次&#xff0c;所以不会再调用finalize()&#xff0c;进而产生问题。 所以&#xff0c;不推荐手动调用finalize()方法&#xff0c;它跟析构函数不一样。


推荐阅读
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Java基础中,私有静态内部类是一种常见的设计模式,主要用于防止外部类的直接调用或实例化。这种内部类仅服务于其所属的外部类,确保了代码的封装性和安全性。通过分析JDK源码,我们可以发现许多常用类中都包含了私有静态内部类,这些内部类虽然功能强大,但其复杂性往往让人感到困惑。本文将深入探讨私有静态内部类的作用、实现方式及其在实际开发中的应用,帮助读者更好地理解和使用这一重要的编程技巧。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 本文详细探讨了MySQL数据库实例化参数的优化方法及其在实例查询中的应用。通过具体的源代码示例,介绍了如何高效地配置和查询MySQL实例,为开发者提供了有价值的参考和实践指导。 ... [详细]
author-avatar
jtzhn_146_607
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有