首页 > 其他分享 >final finally 和 finalize的区别

final finally 和 finalize的区别

时间:2023-08-29 21:45:45浏览次数:37  
标签:finalize finally 修饰 执行 方法 final

     1.final 介绍

final 是 Java 语言中的一个关键字,使用 final 修饰的对象不允许修改或替换其原始值或定义。 ​

final 可以用来修饰:类、方法、变量和参数,其中可以用来修饰“参数”这一项,容易被人遗忘,这是 final 的 4 种用法。 ​

     

         1.1 final 用法说明

  • 当 final 修饰类时,此类不允许被继承,表示此类设计的很完美,不需要被修改和扩展。
  • 当 final 修饰方法时,此方法不允许任何从此类继承的类来重写此方法,表示此方法提供的功能已经满足当前要求,不需要进行扩展。
  • 当 final 修饰变量时,表示该变量一旦被初始化便不可以被修改。
  • 当 final 修饰参数时,表示此参数在整个方法内不允许被修改。
  • 1.2 final 用法展示

    final 修饰类:

    final class Animal {
    
    }

    final 修饰方法:

    public class FinalExample {
        public final void sayHi() {
            System.out.println("Hi~");
        }
    }

    final 修饰变量:

    public class FinalExample {
        private static final String MSG = "hello";
     //......
    }

    final 修饰参数:

    public class FinalExample {
        public void sayHi(final String name) {
            System.out.println("Hi," + name);
        }
    }

    2.finally 介绍

  • finally 则是 Java 中保证重点代码一定要被执行的一种机制。 ​

    我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证释放锁等动作。

    2.1 finally 用法展示

    try {
        // do something
    } finally {
        // 一定会执行的代码
    }
    

    2.2 finally 扩展

    有时候面试也会问:finally 是否一定会被执行?这是一个有诱导嫌疑的问题,正常情况下 finally 一定是会执行的,但有一个特殊情况 finally 也是不会执行的,特殊的实现代码和执行结果如下:

      3.finalize 介绍

finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收,但在 JDK 9 中已经被标记为弃用的方法(deprecated)。

在实际开发中不推荐使用 finalize 方法,它虽然被创造出来,但无法保证 finalize 方法一定会被执行,所以不要依赖它释放任何资源,因为它的执行极不“稳定”。在 JDK 9 中将它废弃,也很好的证明了此观点。 ​

finalize 性能问题

finalize 除了执行“不稳定”之外,还有一定的性能问题。 ​

因为 finalize 的执行是和垃圾收集关联在一起的,一旦实现了非空的 finalize 方法,就会导致相应对象回收呈现数量级上的变慢,有人专门做过 benchmark,大概是 40~50 倍的下降。 ​

因为 finalize 被设计成在对象被垃圾收集前调用,这就意味着实现了 finalize 方法的对象是个“特殊公民”,JVM 要对它进行额外处理。finalize 本质上成为了快速回收的阻碍者,可能导致你的对象经过多个垃圾收集周期才能被回收。

总结

final、finally 和 finalize 从英文字面角度来看,看似很像,实则 3 者在 Java 中没任何关系。final 是用来修饰类、方法、变量和参数的关键字,被 final 修饰的对象不允许修改或替换其原始值或定义;finally 是 Java 中保证重点代码一定要被执行的一种机制;finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收的,但其执行“不稳定”,且有一定的性能问题,已经在 JDK 9 中被设置为弃用的方法了。

 

标签:finalize,finally,修饰,执行,方法,final
From: https://www.cnblogs.com/faweidd/p/17665909.html

相关文章

  • 使用FinalShell 连接虚拟机(Ubuntu) ip报错解决方案
    问题描述使用FinalShell连接时报以下错误:进入虚拟机查看IP时出现以下信息,并没有发现其主机IP信息解决方案在虚拟机(Ubuntu)中运行以下命令sudodhclientens33再次查看其ip信息然后查看FinalShell中,发现连接成功,最终问题得以解决关于dhclient命令dhclient......
  • VMware ESXi 6.7 U3 Final macOS Unlocker & OEM BIOS 集成 Realtek 网卡驱动和 NVMe
    VMwareESXi6.7U3FinalmacOSUnlocker&OEMBIOS集成Realtek网卡驱动和NVMe驱动(集成驱动版)UIfix2023年8月更新新增15款IntelI219系列网卡驱动请访问原文链接:https://sysin.org/blog/vmware-esxi-6-sysin/,查看最新版。原创作品,转载请保留出处。作者主页:sys......
  • 基于java极速WEB+ORM 框架:jfinal2.0开发的通用后台管理系统及源码
    final2-common-admin1、基于java极速web开发框架:jfinal2.0开发的通用后台管理系统,包括完整的登录、注册、菜谱管理、厨师管理、餐厅管理等功能2、开发时是基于jdk1.8、tomcat7.0,utf8编码3、运行时请修改配置文件:a_little_config.txt及相应的运行环境:JavaBuildPath、TargetedR......
  • [SWPUCTF 2021 新生赛]finalrce
    [SWPUCTF2021新生赛]finalrce题目来源:nssctf题目类型:web涉及考点:RCE1.上来先做代码审计<?phphighlight_file(__FILE__);if(isset($_GET['url'])){$url=$_GET['url'];if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|ph......
  • final、finally、finalize 有什么区别?
    final、finally和finalize是在Java中用于不同目的的关键字,它们的作用和使用方式有所不同:final:final是一个关键字,可以用于类、方法和变量。当用于类时,表示这个类不能再被继承(即不能有子类)。当用于方法时,表示这个方法不能被子类重写。当用于变量时,表示这个变量是一个常量,一旦赋......
  • C++11新特性——1.4-1.5 final和override
    1.4final原文:https://subingwen.cn/cpp/final/总结:1.final限制某个类不能被继承,或限制某个虚函数不能被重写2.final修饰虚函数或者类3.final关键字写到虚函数或类后面classBase{public:virtualvoidtest(){cout<<"Baseclass.........
  • [JOI 2023 Final] Advertisement 2 题解
    题解JOI王国有\(N\)位居民,从\(1\)到\(N\)编号。居民\(i\)(\(1\lei\leN\))居住在数轴上坐标\(X_i\)处,其影响力为\(E_i\)。同一个坐标可能住了多于一位居民。居民的影响力越高,广告效应也越高,但买书也越谨慎。Rie出版了一本关于信息学的书。为了让更多人购买这本书,她可......
  • k8s finalizers和owner references
    finalizers终结器,存放键的列表,列表内的键为空时资源才可被删除。删除指定了Finalizer的对象时,填充.metadata.deletionTimestamp来标记要删除的对象,返回已接受202状态码使其进入只读状态。#创建包含finalizers的configmapcat<<EOF|kubectlcreate-f-apiVersion:v1kind:......
  • FinalShell有时突然无法连接虚拟机的相关原因和解决方法
    问题描述关闭虚拟机和FinalShell远程工具突然显示连接超时,再没有动别的东西的情况下,没有办法连接上虚拟机问题解决经过查阅相关资料发现:VMWare虚拟机的IP地址时常变化,出现连接不上的情况也是属于正常情况,解决方法如下:1、打开虚拟机,查看IP地址ifconfig2、找到公网地址IP,更......
  • 异步请求返回处理之finally的用途,代码规范摸索【玩转JavaScript】
    前言最近在改动老代码时,发现了一个有趣的现象。对于异步请求返回结果处理中,使用finally做兜底处理,不同的页面并不统一,也就是有的页面使用了,有的页面没使用,没使用的页面增加了额外的失败的处理。所以finally到底要不要统一?本着代码规范化原则的思维,我准备一探究竟。文章速度finally......