朝花夕拾——finally/final/finalize拨云雾见青天

Java编程中。常常会使用到异常处理,而finally看似的是try/catch后对逻辑处理的完好,事实上里面却存在非常多隐晦的陷阱。final常见于变量修饰,那么你在内部类中也见过吧。finalize作为GC回收对象前的一道门,什么时候运行。运行效果又是如何。有时看看又忘了。以下是我总结网上朋友的一些博文及其帖子对三者进行总结。(重点讲下finally)

先看final

  • Final修饰变量不能被又一次赋值,其修饰实例变量时,定义时指定值则可视为“宏变量”。在非静态代码块和构造器中初始化值则不是。其修饰类变量时。仅仅有在定义时指定值才视为“宏变量”,在静态代码块中初始化则不是。

  • Final修饰的方法不能被重写
  • Final修饰的类不能被继承
  • 内部类一般使用final修饰的局部变量。

在看finalize

  • 系统调用finalize方法具有不确定性
  • finalize方法是protected方法。子类能够覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。一般当对象在变成不可到达的时候,GC会推断是否覆盖该方法,假设没有覆盖就直接回收。假设覆盖就把该对象放进F-Queue队列并由一低优先级线程运行该对象的finalize方法,然后再次推断是否可达。
  • 尽量不要去调用finalize,假设调用。则避免对象再生,多用于关闭流。

最后细斟finally

  • Finall语句在return语句运行之后,return返回之前运行;
  • Finally块中的return语句运行结果覆盖try和catch中运行的return语句运行结果
  • Finally块中操作try/catch返回基本变量时。结果不受finally操作影响
  • Finally块中操作try/catch返回引用对象时。

    结果受finally操作影响

以下给出几个样例验证finally的4个重要观点

样例1代码例如以下:
package java_zhaohuaxishi;public class Example1 {public int test(){int i = 0;		try{i = 10;System.out.println("try");return i+=10;}catch(Exception e){i = 20;return 200;}finally{System.out.println("finally");System.out.println(i);}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example1().test());}}
执行结果:
try
finally
20
20
这也意味着finally打印出来的是try中return已经计算了的,验证观点一。

样例2代码例如以下:
package java_zhaohuaxishi;public class Example1 {public int test(){int i = 0;		try{i = 10;return 100;}catch(Exception e){i = 20;return 200;}finally{return i;}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example1().test());}}
上述时没有出现异常情况,打印例如以下:
10

再给出出现异常情况,代码例如以下:
package java_zhaohuaxishi;public class Example2 {public int test(){int i = 0;		try{i = 10/0;return 100;}catch(Exception e){i = 20;return 200;}finally{return i;}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example2().test());}}
打印结果例如以下:
20
结果是:不管出现异常与否,finally的return总会覆盖try/catch中return的结果。验证观点二。


样例3代码例如以下:
package java_zhaohuaxishi;public class Example5 {public int test(){int i = 0;		try{i = 10;return i;			}catch(Exception e){i = 20;return i;			}finally{i=30;//return i;}		}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example5().test());}
}
打印结果例如以下:
10
能够看到。实际上finally改动i变量是不起作用的。验证观点三。


样例4代码例如以下:
package java_zhaohuaxishi;class Test{int num;public Test(int num){this.num = num;		}public int getNum() {return num;}public void setNum(int num) {this.num = num;}}public class Example3 {public Test test(){		Test t  = new Test(0);		try{t.setNum(10);return t;}catch(Exception e){t.setNum(20);return t;}finally{t.setNum(30);}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example3().test().getNum());}}
打印结果例如以下:
30
从上述结果来看,finally操作的对象确实是与try上的同一个对象。那么我们比較上面观点三,操作变量的时候是不能更改的,想想有点诡异。我们看以下代码:
package java_zhaohuaxishi;class Test{int num;	public Test(int num){this.num = num;		}public int getNum() {return num;}public void setNum(int num) {this.num = num;}}public class Example3 {public int test(){Test t  = new Test(0);try{t.setNum(10);System.out.println(t.getNum());return t.getNum();}catch(Exception e){t.setNum(20);return t.getNum();}finally{System.out.println(t.getNum());t.setNum(30);}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example3().test());}}
这次我们不在返回对象。而是返回一个int变量。从观点一我们能够知道,返回的t.getNum()实际上是会先计算再保存起来。那么假设我们在finally中在去改变t的num,实际上t的num会被改变,然而返回的应该还是10。
打印结果例如以下:
10
30
10
果然!这与我们预先的是一模一样。假设有人认为finally中t对象可能与try中不一致。以下样例将会让你认为非常奇妙:
package java_zhaohuaxishi;class Test4{int num;public Test4(int num){this.num = num;		}public int getNum() {return num;}public void setNum(int num) {this.num = num;}}public class Example4 {public Test4 test(Test4 t){		System.out.println("传进去的t:"+t.hashCode());try{t.setNum(10);return t;}catch(Exception e){t.setNum(20);return t;}finally{//t.setNum(30);System.out.println("finally改动前:"+t.hashCode());t = new Test4(0);System.out.println("finally改动后:"+t.hashCode());//return t;}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubTest4 t  = new Test4(0);System.out.println("return返回对象"+new Example4().test(t).hashCode());System.out.println("最后的t:"+t.hashCode());}}
我们来看看打印结果:
传进去的t:2004703190
finally改动前:2004703190
finally改动后:1175576547
return返回对象2004703190
最后的t:2004703190
这结果看起来非常奇妙。我们验证观点四的时候操作对象是起作用的!然而当我们试图去改动t引用让他指向其它对象的时候居然无效......

如有很多其它兴趣深入了解。可进一步认识JVM工作机制!



















转载于:https://www.cnblogs.com/blfbuaa/p/6915692.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java读源代码学设计模式:适配器Adapter

适配器模式相关源代码:slf4j-1.6.1、hibernate-3.6.7大家都知道。log4j是一个广泛使用的日志工具,除此之外。sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger。当然还有其它一些日志工具。多种日志工具功能和使用方式相似&…

适合文科女孩子学的计算机类专业,文科女生最吃香的专业2021 哪些专业有前景...

文科女生最吃香的专业2021 哪些专业有前景2021-03-27 14:36:27文/丁雪竹文科女生可以报考的专业并不是很多,小编整理了文科女生吃香的专业,来看一下!文科女生最吃香的专业网络与新媒体这个专业是近几年流行起来的新兴专业,需求量还…

系统搭建遇到问题3:Ubuntu问题造成网卡名称异常导致Vivado绑定网卡地址的Lic无法正常工作(JESD)...

解决方法参考: ubuntu平台vivado无法识别NIC_ID而无法使用license的解决办法 http://blog.csdn.net/cirs_q/article/details/60574030转载于:https://www.cnblogs.com/abolide/p/6920397.html

中职计算机基础知识总结,中职计算机基础知识整理

中职计算机基础知识整理计算机基础知识(初稿2011/10/5)1、计算机发展简史第一代(1946-1957年)电子管第二代(1958-1964年)晶体管第三代(1964-1970年)中、小规模集成电路第四代(1971年至今)大规模和超大规模集成电路2、我国计算机发展我国电子计算机研究工作起步于1956年1958年试…

多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...

在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title 呢?下面介绍两种方法。使用router.Meta…

Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐)

不多说,直接上干货! 在这篇博客里,我采用了非官网的安装步骤,来进行安装。走了弯路,同时,也是不建议。因为在大数据领域和实际生产里,还是要走正规的为好。 Ubuntu16.04下Mongodb(离…

甘肃政法学院计算机科学与技术试题,甘肃政法学院计算机科学与技术专业课程教学大纲.doc...

甘肃政法学院计算机科学与技术专业课程教学大纲甘肃政法学院计算机科学与技术专业课程教学大纲数字逻辑与分析一、说明(一)课程性质(三)教学内容1.了解数字电路和脉冲电路的概念。2.TTL门电路、CMOS两类集成门电路的外部特性:逻辑功能、电器特…

我确实不知道如何使用计算机的英文,用英语介绍我的电脑

篇一:电脑 ComputerComputer is a very useful machine. Some of them are big, but some of them are very small .Many people like playing computer. Computer has many functions, so that people can do a lot of things by computer, like watching movies, …

第二阶段个人工作总结04

昨天做了什么? 优化评论页面。 今天准备做什么? 对点赞修改。 遇到什么困难? 无。转载于:https://www.cnblogs.com/fylove/p/6979899.html

uva 11971 Polygon

https://vjudge.net/problem/UVA-11971 有一根长度为n的木条&#xff0c;随机选k个位置把它们切成k1段小木条。求这些小木条能组成一个多边形的概率。 将木条看做一个圆&#xff0c;线上切k刀等价于圆上切k1刀 如果能组成多边形&#xff0c;每一段木条的长度都要<圆周长/2 反…

计算机修改文字试题,计算机文字处理试题.doc

计算机文字处理试题文字处理单选题1、Word文档文件的扩展名是______。A&#xff1a;txtB&#xff1a;docC&#xff1a;batD&#xff1a;dat答案&#xff1a;B2、Word程序启动后就自动打开一个文档&#xff0c;其文档名为______。A&#xff1a;文档1B&#xff1a;文档0C&#xf…

Charles - 接口抓包分析工具

Charles是一个HTTP代理服务器&#xff0c;反转代理服务器&#xff0c;HTTP监视器。它允许一个开发者查看所有连接互联网的HTTP通信&#xff0c;包括request、 response现HTTP headers &#xff08;包含cookies与caching信息&#xff09;。 下载&#xff1a; http://www.charle…

计算机网络实用期末试题和答案,计算机网络期末考试试题及答案(1)

计算机网络期末考试试题及答案填空题(每空 1 分&#xff0c;共 30 分)1、在计算机网络的定义中&#xff0c;一个计算机网络包含多台具有__自治____功能的计算机&#xff1b;把众多计算机有机连接起来要遵循规定的约定和规则&#xff0c;即__通信协议_____&#xff1b;计算机网络…

微型计算机原理及接口技术林志贵,微型计算机原理及接口技术第七章部分习题答案林志贵主编...

《微型计算机原理及接口技术第七章部分习题答案林志贵主编》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《微型计算机原理及接口技术第七章部分习题答案林志贵主编(7页珍藏版)》请在人人文库网上搜索。1、7-1、I/O接口的信号有哪几种&#xff1f;各有什么特点&#…

表现与数据分离;前台MVC

无意间看到一个web前端招聘要求&#xff1a;表现与数据分离 这名词对我非常陌生&#xff0c;我就去百度了下 由于有各种莫名其妙的需求&#xff0c;所以才会出现我们前端MVC这样的莫名其妙的东西。。。我们的html就是model&#xff0c;我们的css就是view。我们的js就是controll…

街上第一台电子计算机是,南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc...

南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc南京信息工程大学滨江学院2009 ─ 2010 学年 第 一 学期计 算 机 基 础(文) 课程试卷试卷类型 A (注明A、B卷) 考试类型 闭卷 (注明开、闭卷)注意&#xff1a;1、本课程为 必修 (注明必修或选修)&…

使用EFI引导从硬盘(U盘)安装Win7的图文教程

眼下仅支持vista后的64位系统大部分使用EFI引导安装Win7的教程都是採用光盘启动安装&#xff0c;尽管光盘安装比較简单&#xff0c;可是对于没有光驱的朋友来说还是相当不便&#xff0c;更不用说光盘安装的两大缺点了&#xff0c;一速度慢&#xff0c;二不灵活。因此本篇教程将…

计算机语言中str是什么意思,vb中str什么意思

vb中str什么意思&#xff1f;str是VB的一种函数&#xff0c;可以将数字型变量或常量转换成字符型变量或常量。str函数的功能是返回代表一数值的Variant (String)。当一数字转成字符串时&#xff0c;总会在前头保留一空位来表示正负。如果 number 为正&#xff0c;返回的字符串包…

基于探究式教学法的计算机网络原理课程的教学改革与实践,基于探究式教学法的“计算机网络原理”课程的教学改革与实践分析...

基于探究式教学法的 “计算机网络原理”课程的教学改革与实践分析张敏莉摘要“&#xff1a;计算机网络原理”课程教学的目标是让学生学习和掌握计算机网络的基本概念、原理、方法以及具体实现技术等基础知识&#xff0c;为学生学习其他计算机专业课程奠定坚实基础。本文在分析“…

异步编程

1、async/await特性结构 异步方法&#xff1a;就是在处理完成之前就返回到调用方法。 async/await特性结构由三个部分构成&#xff1a; (1)调用方法&#xff1a;调用异步方法的那个方法&#xff0c;它和异步方法可能在相同的线程&#xff0c;也可能在不同的线程。在异步方法执行…