💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

【Java基础系列】final/finally/finalize的区别_成员变量

  • 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
  • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
  • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
  • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
  • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
  • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨


博客目录

  • 一.概述
  • 1.final
  • 2.finally
  • 3.finalize
  • 二.final 详解
  • 1.定义变量
  • 2 定义参数
  • 3 定义方法
  • 4 定义类
  • 三.对比
  • 1.性质不同
  • 2.作用


一.概述

1.final

用于修饰类、成员变量和成员方法。final 修饰的类,不能被继承(String、StrngBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写,所有不能同时用 abstract 和 final 修饰(abstract 修饰的是抽象类,抽象类是用于被子类继承的,和 final 起相反的作用);final 修饰的方法不能被重写,但是子类可以用父类中 final 修饰的方法;final 修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象中的内容是允许改变的。

2.finally

finally 是在异常处理时提供 finally 块来执行任何清除操作。不管有没有异常被抛出、捕获都会被执行。try 块中的内容是在无异常时执行到结束。catch 块中的内容,是在 try 块内容发生 catch 所声明的异常时,跳转到 catch 块中执行。finally 块则是无论异常是否发生都会执行 finally 块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,可以放在 finally 块中。

3.finalize

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

二.final 详解

1.定义变量

1.1 final 定义基本类型变量时,要求变量初始化必须在声明时或者构造函数中,不能用于其它地方。该关键字定义的常量,除了初始化阶段,不能更改常量的值。

1.2 final 定义对象的引用,该引用的初始化与定义常量时的要求一致;该关键字定义的对象内容可以改变,但是引用指向的地址不能改变;

2 定义参数

如果传入该参数定义的变量时,方法不能对该参数内容进行修改(错误),与定义变量的修改规则相同;java 方法中传递基本类型时是传值的,java 方法对于对象的传递是传参的;<归根结底,java 中方法的传递是依靠传递“副本”:对于基本类型,首先建立一个 Copy,并将传入的值赋值给 Copy,然后对 Copy 进行操作;对于对象类型,首先建立一个引用 Copy,并将传入的对象引用赋值给 Copy>

比如:method(final int test);

有些书上说,这里 final 定义参数,尤其是对象的参数很有作用,不能在方法内对于对象的内容进行改变,这样的说法是错误的!原来我也认为这样有些函数式编程的特点,不能对于对象的内容进行修改该,这里依旧可以对对象的内容进行修改。

String 天生就是 final 类型的!

3 定义方法

(1)使用 final 关键字定义的方法,不能被子类继承;

(2)允许编译器将所有对此方法的调用转化为 inline(行内)行为,即可以将此方法直接复制在调用处,而不是进行例行的方法调用(保存断点、压栈),这样会使程序的效率升高。但是---------如果过多的话,这样会造成代码膨胀,反而会影响效率,所以该方法要慎用。。

4 定义类

一个任何 final 类无法被任何人继承,这也就意味着此类在一个继承树中是一个叶子类,并且此类被认为是很完美的,不需要进行任何修改(总之是不推荐使用)

三.对比

1.性质不同

  1. final 为关键字;
  2. finalize()为方法;
  3. finally 为为区块标志,用于 try 语句中;

2.作用

(1)final 为用于标识常量的关键字,final 标识的关键字存储在常量池中(在这里 final 常量的具体用法将在下面进行介绍);

(2)finalize()方法在 Object 中进行了定义,用于在对象“消失”时,由 JVM 进行调用用于对对象进行垃圾回收,类似于 C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行 I/0 操作);

(3)finally{}用于标识代码块,与 try{}进行配合,不论 try 中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

【Java基础系列】final/finally/finalize的区别_成员变量_02