【面试题】final, finally, finalize 的区别

【交易系统系列27】带你看懂订单的“奇幻漂流” 作为一个在交易所后台“厨房”里摸爬滚打了十多年的老兵,我将用一杯手冲咖啡的时间,带你亲历一次完整的订单“奇幻漂流”。本文将用一个“奶爸”的生活视角,硬核拆解**撮合(Matching)**、**清算(Clearing)**、**结算(Settlement)**和**出入金**这四大核心环节。这不仅是一次对**交易系统优化**和**撮合引擎架构**的深度剖析,更是一场关于传统金融与数字金融两种不同“上菜”哲学的真实故事。 阅读详情

目录

final

修饰类

修饰方法

修饰变量

finaly

易错点

finalize


final

在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)。

修饰类

当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用final修饰,但要注意:final类中所有的成员方法都会隐式的定义为final方法。

修饰方法

使用final修饰方法的原因主要有两个:

  1. 把方法锁定,以防止继承类对其进行更改。
  2. 效率,在早期的java版本中,会将final方法转为内嵌调用。但若方法过于庞大,可能在性能上不会有多大提升。因此在最近版本中,不需要final方法进行这些优化了。

final方法意味着“最后的、最终的”含义,即此方法不能被重写。

注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。

class A{
    private final void getName(){
    }
}

public class B extends A{
    public void getName(){
    }

    public static void main(String[]args){
        System.out.println("OK");
    }
}

修饰变量

final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。类似于C++中的const。

当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。

final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。

当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。

字符串常量池是java堆内存中一个特殊的存储区域,当我们建立一个String对象时,假设常量池不存在该字符串,则创建一个,若存在则直接引用已经存在的字符串。当我们对String对象值改变的时候,例如 String a="A"; a="B" 。a是String对象的一个引用(我们这里所说的String对象其实是指字符串常量),当a=“B”执行时,并不是原本String对象("A")发生改变,而是创建一个新的对象("B"),令a引用它。

finaly

 当我们去掉注释的三行语句,执行结果为:

只有与finally对应的try语句块得到执行的情况下,finally语句块才会执行。以上两种情况在执行try语句块之前已经返回或抛出异常,所以try对应的finally语句并没有执行。 

但是,在某些情况下,即使try语句执行了,finally语句也不一定执行。例如以下情况:

 finally仍然没有执行,由于在 try 语句块中执行了 System.exit (0) 语句,终止了Java 虚拟机的运行。

当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。

易错点

在try-catch-finally语句中执行return语句。如下代码:

答案:4,4,4

首先finally语句在该代码中一定会执行,从运行结果来看,每次return的结果都是4(即finally语句),仿佛其他return语句被屏蔽掉了。

事实也确实如此,因为finally用法特殊,所以会撤销之前的return语句,继续执行最后的finally块中的代码。  

finalize

finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。

特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。

使用finalize还需要注意一个事,调用super.finalize();

一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。

SAP GR(Group Reporting)配置篇(五) 1.5、合并的货币换算1.5.1指定折算比率菜单路径组报表的SAP S4HANA >合并的货币换算>-指定折算汇率事务代码GCRF说 明1.5.2维护汇率菜单路径组报表的SAP S4HANA >合并的货币换算>维护汇率事务代码CXCC/OB08说 明实际测试的时候根据实际情况维护汇率。输入换算比率。1.5.3定义汇率标识符菜单路径组报表的SAP S4HANA >合并的货币换算>定义汇率标识符事务代码OC41说 明配置了月末汇率和平均汇率。 阅读详情

相关推荐

半导体物理-Si晶体生长方向<2>

Si(硅)晶体的生长方向是一个重要的概念,尤其在半导体工业中。这个概念涉及到晶体在生长过程中原子排列的方向,对晶体的性质和应用有重大影响。让我为您详细解释:理解Si晶体的生长方向对于半导体材料的研究和应用非常重要,它直接影响了最终器件的性能和制造工艺。在实际应用中,选择适当的生长方向可以优化器件性能,提高产品质量。

m0_37606066的博客 2991

面试之final、finally 和finalize区别

目录final 用来修饰一个类:final修饰方法:final修饰变量:1.final修饰属性:2.final 修饰局部变量:static final final:最终的 1.final可以用来修饰的结构:类、方法、变量 final 用来修饰一个类: 2.final 用来修饰一个类:表示此类是最终的一个类(不能有孩子了)。此类不能被其他类所继承。 比如:SAtring,System类,StringBuffter类。 final修饰方法: final用来修饰方法:表示是最终的方法,不能去延续拓展了(即

weixin_38568503的博客 1465

GWAS与eQTL相结合,进一步筛选疾病相关基因

欢迎关注”生信修炼手册”!在GWAS分析结果中,大部分显著的SNP位点都位于非编码区,很难直接挖掘这些位点的调控机制。通常假设与疾病关联的SNP位点通过调控基因表达来发挥作用,而eQTL...

庐州月光的博客 1万+

38,Final,finally,finalize三者的区别

package cn.itcast_09; /* * 面试题:Final,finally,finalize三者的区别 * Final * 最终的意思,可以修饰类 ,成员变量,成员方法 * 修饰类:类不能被继承 * 修饰变量:变量是常量 * 修饰方法:方法不能被重写 * finally * 是异常处理的一部分,用于释放资源 * 一般来说,代码肯定会执行: * 特殊情况除外:在执行到finally之前JVM推

kaszxc的博客 318

【openEuler容器镜像部署指南】

【代码】【List集合排序 】

weixin_43878094的博客 1111

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 478

面试题总结——final,finally,finalize的区别

面试题总结——final,finally,finalize的区别  final关键字   1、final用于修饰变量:表示为一个常量,类型和值都不能变化   2、final用于修饰方法:表示该方法不能被覆写   3、final用于修饰类:表示该类不能被继承   4、static final:表示全局常量,命名规则一般为全大写  finally   用于Java异常体系,和try-catch搭配使用...

xiaoaxiao 498

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8312

面试题:final、 finally、 finalize的区别

final: 最终的,最后的,决定性的,不可改变的; 这个词在java里中文意思比较偏重于“不可改变的”,比如说:“长跑比赛final结果”,就是说比赛的结果是不可改变的,在踩终点线前,你还可以改变,可以逆袭从最后一名变成第一名,但踩线后结果出来是啥样就是啥样,不可改变; finally:这个是副词,可以修饰动词;java中修饰的就是动词try; 例句: after se...

zhang150114的博客 609

14、多标签分类与卷积神经网络在医学图像处理中的应用

本文探讨了多标签分类与卷积神经网络(CNN)在医学图像处理中的应用。文章详细介绍了多标签分类的概念和挑战,以及如何通过CNN进行高效、准确的分类任务。内容涵盖模型设计、损失函数选择、数据增强技术、类别权重调整等关键技术点,并结合实际案例,如白内障手术工具检测、视网膜血管分割等,展示了CNN在医学图像分析中的强大潜力。此外,还讨论了模型优化策略及面临的挑战与解决方案。

t8u9v0的博客 191

Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)

html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu

🏆 前端领域优质创作者 3907

java面试整理(二)——final,finally,finalize

final,finally,finalize这三个看似一样,其实三个是完全不是一系列的东西。 final 该关键字是一个修饰语,用于修饰成员变量、类、类或对象的引用、方法。 final修饰变量:final修饰变量说明该变量就是一个常量值,既可以是成员变量又可以是局部变量。其只能赋值一次,也就是说你不能在程序的任何地方在赋值后再修改该变量的值,如java.lang.Math类中的PI和E是fi...

落尘 666

某勾网之登录过程逆向

拉勾网的登录过程逆向,包含请求头(X-S-HEADER、X-K-HEADER、X-SS-REQ-HEADER等) 以及 请求参数/返回数据的加解密。

shanf7921的博客 3万+

面试题总结:final、finally、finalize 的区别

这里写目录标题1.final关键字final优势:2. finally3. finalize 1.final关键字 一个基本数据类型声明为final,就只能进行一次赋值(初始化),编译器会自动检查代码,如果需要修改final的初始化,就会编译报错。final声明的引用数据类型,当前引用是不能改变的,但是可以改变引用指向的内存空间的值。final一般和static搭配使用作为常量。 final关键字的三种用法: 1)修饰类:表示该类不能被继承(extends); 2)修饰方法:表示方法不能被重写(overr

华山栈道的博客 568

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

面试题:谈谈final、finally、finalize的区别

另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。final类不能被继承,没有子类,final类中的方法默认是final的。

m0_74259311的博客 180

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JAVA面试题——final、finally和finalize的区别

JAVA面试题——final、finally和finalize的区别 final:java中的关键字,修饰符 final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。 它可以用于以下四个地方:   1. 定义变量,包括静态的和非静态的。   2. 定义方法的参数。   3. 定义方法。   4. 定义类。 第一种情况,如果final修饰的是一个基本类型,就表示这个变量被赋...

qq_34215325的博客 597

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Java面试题2】final、finally、finalize的区别

final、finally、finalize的区别 final final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。 将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写,但是能够重载。 那么被final修饰的变量是常量吗? 其实不全是,final修饰的成员变量(实例变量)和静态变量(静态变量也只能是用static修

高朗的博客 339

JAVA面试题:final,finally,finalize有什么区别?

一、 今天学习了JAVA异常处理,那学习这些的时候了解到了finally,就牵扯到了关于final,finally,finalize的区别问题,下面我就来总结一下学到的吧。 二、fianl 那我们首先要知道final是个关键字,用来声明属性、方法和类, ...

qq_43883961的博客 331

java面试题:final finally finalize三者的作用和区别

java面试题:final finally finalize三者的作用和区别 final final是一个修饰符 当final修饰一个变量的时候,变量变成常量,不能被二次赋值 当final修饰的变量为静态变量(static修饰)时,必须在声明这个变量的时候给它赋值 当final修饰方法时,该方法不能被重写 当final修饰类时,该类不能被继承 Final不能修饰类时,因为抽象类中会有需要子类实现的...

weixin_42913025的博客 368

面试题:谈谈你对 final 关键字以及 final、finally、finalize的区别

final 关键字 final:代表最终的、不可变的 常用的四种方法: 1、可以用来修饰一个类 2、可以用来修饰一个方法 3、可以用来修饰一个局部变量 4、可以用来修饰一个成员变量 一、修饰一个类 当一个类被 final 修饰时,这个类不能有任何子类(断子绝孙) 格式: public final class 类名称 { // ...... } 注意:如果一个类是 final 的,那么其中所有的成员方法都无法进行覆盖重写(因为没有儿子) public final class Fu {

H_Q_Li的博客 412

【Java基础面试题:final,finally,finalize的区别?】

本章介绍经典基础面试题:final,finally,finalize的区别

qq_45905737的博客 816

面试题解惑系列(四)——final、finally和finalize的区别

final、finally和finalize的区别是什么? 这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是大相径庭。这一次我们就一起来回顾一下这方面的知识。 [b][size=medium]final关键字[/size] [/b] 我们首先来说说fina...

陈宇波的博客 187

Java面试题5——final、finally和finalize的区别

final、finally和finalize的区别 1.final为修饰符 final为Java关键字,用来修饰类、属性、方法。如果一个类被声明为final,意味着不能派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract,又被声明为final。 将变量和方法声明为final,可以保证他们在使用时不被改变。 被声明为final的变量必须在声明时给定初始值,而在以后的引用只能...

huiyanfreeflying的博客 223

面试题:finally,final,finalize的区别

(1)finally 最终块 无论try中是否有异常,无论catch是否可以捕获异常,也不管try和catch中是否有return,都一定要执行的部分 (2)final 是一个修饰符 修饰类:表示不能被继承 修饰方法:表示不能被重写 修饰变量:表示常量,值不能修改 (3)finalize 是一个方法名 在Object类中声明的,当对象被GC回收之前调用 ...

可乐葱花 176

Java面试题:final、finally、finalize的区别

final用于声明属性方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其它资源回收,例如关闭文件等。JVM不保证此方法总被调用。...

跟着BOSS有肉吃 1027

【Java面试题系列】:Java中final finally finalize的区别

本篇为【Java面试题系列】第三篇,文中如有错误,欢迎指正。 第一篇链接:【Java面试题系列】:Java基础知识常见面试题汇总 第一篇 第二篇链接:【Java面试题系列】:Java基础知识常见面试题汇总 第二篇 按我的个人理解,这个题目本身就问的有点问题,因为这3个关键字之间没啥关系,是相对独立的,我猜想这道题的初衷应该是想了解面试者对Java中final finally finalize的...

weixin_33749131的博客 208
上一篇: 【面试题】面向对象的主要特征
下一篇: 【面试题】Exception、Error、运行时异常与一般异常有何异同
红枫忆梦
博客等级 码龄8年 117粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值