Java深究之final、finally、finalize三者的区别

Wesley13
• 阅读 486

        在java中final、finally、finalize三者在写法上很相近,但是实际含义和作用却是相差甚远。本文主要是来深层的研究下这三者的用法以及之间的区别

1.final

属性:java中的关键字,修饰符

作用:用于修饰类、成员方法、变量(成员变量、局部变量)

用法:如果类被声明为final,那么该类就不能再派生出新的子类,也不能当作父类被子类继承。一个类不能同时被声明为抽象类(absrtact修饰)和final的类;如果成员方法被声明final,那么该方法只能使用,不能重载;如果变量(成员变量、局部变量)被声明为final,那么必须在声明时给定初始化的值,在后面的引用中只能读取,不可修改值。

注意:1.类被声明为final,类中的所有成员方法都会被隐式地指定为final方法; 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则编译时会报错; 3.在匿名类(内部类)中所有变量都必须是final变量; 4.在接口中声明的所有变量本身是final的; 5.如果基本数据类型的变量被声明为final,则其数值一旦在初始化之后便不能更改

Java深究之final、finally、finalize三者的区别

如果引用类型的变量被声明为final,则在对其初始化之后便不能再让其指向另一个对象,但该对象的内容是可以改变的

Java深究之final、finally、finalize三者的区别

6.当final变量是基本数据类型以及String类型时,在编译期间是知道它的确切值,那么编译器会把它当做编译期常量,在用到该final变量的地方,相当于直接访问的这个常量

Java深究之final、finally、finalize三者的区别          

只有在编译期间能确定final变量值的时候才会被当编译常量,以下是编译时不知道确定值的

Java深究之final、finally、finalize三者的区别

2.finally

属性:异常处理时的finally块 

作用:  try { 正常逻辑 } catch(Exception e) { 异常逻辑 } finally{ 一定会被执行的逻辑 }

用法:异常处理(try  catch)时finally块无论有没有异常发生,finally块的代码一定会被执行,所以在程序中有需要无论发生什么都必须执行的代码,就可以放在finally块中,最常见流关闭等释放资源的操作

注意:1.finally代码块无论有没有异常发生,finally块的代码一定会被执行; 2.即使try里包含continue、break、return语句,try块结束后,finally块也会执行; 3.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

3.finalize

属性:方法名,Object中的方法

作用:finalize()方法是在垃圾收集器删除对象之前对这个对象调用

用法:Java中使用finalize()方法在垃圾收集器将对象从内存中清除出去之前(GC之前)做必要的清理内存的工作。这个方法是在垃圾收集器确认一个对象没有被引用时对这个对象调用的。它在Object类中定义的,所有的类都继承了它。子类覆盖finalize()方法已整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的

注意:1.垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法

Java深究之final、finally、finalize三者的区别

2.程序退出时为每个对象调用一次finalize方法

3.当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用

4.finalize()方法被关键字protected修饰是防止在该类之外定义的代码访问finalize()标识符

Java深究之final、finally、finalize三者的区别

5.finalize()方法的主要用途是释放一些其他做法开辟的内存空间,以及做一些清理工作

  1. 一旦垃圾回收器GC准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。只有到下一次再进行垃圾回收动作的时候,才会真正释放这个对象所占用的内存空间

7.finalize()现在已经不推荐使用了,java9已经设置为deprecated了

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
java核心技术36讲笔记
JavaBasic谈谈final、finally、finalize有什么不同?典型回答:final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的(override)。finally则是
Wesley13 Wesley13
2年前
java常用的关键字
1、final关键字final关键字可用于修饰类、方法以及变量。修饰类:该类不能被继承,该类的所有方法和成员都被隐式地指定为final。修饰方法:锁定方法,任何继承类都不能修改他,所有的private方法都被隐式地指定为final方法。修饰变量:若修饰的变量为基本数据类型,该变量值被赋值后不可改变;若修饰的变量为引用类型的变量,该变量
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
2年前
Lua基础(对象)
:和.区别.   stu{id100,name"Tom",age21}成员变量   function stu.toString()成员函数    return stu.id .. stu.name .. stu.age   endprint(stu
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这