return本质探究以及try-finaly下的return探究
return本质探究
其实reutrn语句本质上我们可以把它分为两步
1.return语句获取到变量的地址
2.return将获取的地址返回,也就是return本质是传地址
这里可以看下面的结果
try字符串的hashcode:115131StringBuilder里的try的hashCode:1361960727catch里面return语句返回的:try 返回值的hashCode:1361960727
这里try字符串的hashcode的值和catch里面的return的hashcode值完全不同,
而StringBuilder实例的hashcode值则和catch里面的return的hashcode值相同,
由此可知:return本质是传地址
.try-finaly里面的return,现象是catch里面的return值并不会随finaly里的修改而改变,对此大家众说纷纭,甚至扯到基本类型和引用类型的差别的:
接下以一个例子来说会更好理解,代码如下:
public class Test123 {public static void main(String[] args) {Too too=new Too();StringBuilder t1=test(too);System.out.println("catch里面return语句返回的:"+t1+"\t返回值的hashCode:"+t1.hashCode());System.out.println("finaly里面修改的:"+too.num+"\tfinaly的hashCode:"+too.num.hashCode());}public static StringBuilder test(Too too) {try {too.num=new StringBuilder("try");System.out.println("try字符串的hashcode:"+("try").hashCode());System.out.println("StringBuilder里的try的hashCode:"+too.num.hashCode());//--语句1return too.num; //语句2} finally {too.num=new StringBuilder("finaly");//语句3System.out.println("finaly的hashCode:"+too.num.hashCode());//语句4}}}class Too{StringBuilder num=new StringBuilder("你好");
}
结果如下:
try字符串的hashcode:115131StringBuilder里的try的hashCode:1361960727finaly的hashCode:739498517catch里面return语句返回的:try 返回值的hashCode:1361960727finaly里面修改的:finaly finaly的hashCode:739498517
这里需要注意到一个细节,当使用debug的时候会发现一个有趣的现象,就是程序在try程序块内部并不是执行完下面注释中的(语句1)之后就直接跳到finaly里面了,而是执行了return语句(语句2)之后跳到finaly里面的,所以其实return语句是执行了的,也就是(语句2)其实是执行了,但并未返回.
说到这里大家再看一下上面关于return语句的本质,估计大家就明白了,这里的return语句只执行了一半,也就是上面写的第一步,return语句获取变量地址,
但并未执行第二步返回
总结一下执行顺序就是 语句1 -> 语句2的前半句(return获取变量地址) -> 语句3 -> 语句4 -> 语句2的后半句(return返回)
因为在进入finaly以前return已经获取到了需要传输的地址,所以finaly里面的语句对too对象的操作无法对return的值产生影响,只是让too对象指向了一个新地址。
return本质探究以及try-finaly下的return探究相关推荐
- caffe学习日记--lesson5: VS下新建工程,探究Blob
caffe学习日记--lesson5: VS下新建工程,探究Blob 在VS2013下新建工程,探究caffe的数据结构Blob,并使用.熟悉caffe 1.新建空白的控制台应用程序,添加main.c ...
- 异常:catch下的return;
import java.io.FileNotFoundException;public class TryCatchDemo {public static void main(String[] arg ...
- 计算机的本质:在信息的控制下,利用能量实现运算。(提高单位能耗的计算能力,一直都是IT业发展的方向)
文章目录 前言 I .计算机的本质:在信息的控制下,利用能量实现运算. 1.1 Binary 1.2 Logic Gates 1.3 Building logic gates from transis ...
- java的tey语句return了_Java finally语句到底是在return之前还是之后执行?
网上有很多人探讨Java中异常捕获机制try-catch-finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语 ...
- python中一个函数只允许有一条return语句_一个函数应该只有一个return语句吗?
我经常在一个方法的开头有几个语句来返回"简单"的情况.例如,这个: public void DoStuff(Foo foo) { if (foo != null) { ... } ...
- Mybatis中的attempted to return null from a method with a primitive return type (int).异常
错误截图: org.apache.ibatis.binding.BindingException: Mapper method 'com.shop_demo.dao.AdminDAO.getAdmin ...
- Null return value from advice does not match primitive return type for: public abstract boolean
今天在写Spring Data JPA的时候出现了这样一个问题 Null return value from advice does not match primitive return type f ...
- python return函数_理解Python函数中的return关键字
一.说明 return 语句是Python函数返回的结果,可以是数值.字符串.列表.表达式.函数等: return 语句将Python函数的结果,返回到调用的地方,并把程序的控制权一起返回,即在函数中 ...
- attempted to return null from a method with a primitive return type (int).
错误产生的场景 dao层接口如下 int getResourceDataNumsByTitle(String title); mapper.xml 中sql语句如下 <select id=&qu ...
最新文章
- Data - 数据思维 - 中篇
- RDKit | 基于最大公共子结构(MCS)的分子比对
- 我们该怎么成为技术尖子生
- Mac 删除应用卸载后无法正常移除的图标
- Python爬虫常用模块
- 社交网络初探——链路预测
- php遍历多维数据库,PHP代码优化之array_column() 使用(解决循环嵌套Sql的问题)
- java 注释 代码,如何在Java中注释代码块
- WINDOWS上svn服务器自动部署
- 构造器模式(Builder模式)
- Uipath鼠标单击扩展教程
- 鸿蒙二部曲关系,用鸿蒙OS在蜂鸣器上放一曲《两只老虎》
- 全网最详细的Yolov3训练Caltech Pedestrain数据集并绘制fppi miss rate图
- printf输出二进制
- 微服务系列之单体架构
- 高三计算机教学总结,2021年高三信息技术教学工作总结范文.doc
- 个人微信号API接口搜集
- mac设置文件权限_如何在Mac上设置文件权限
- 2022最新软件测试面试题(附答案)来测试下你的水平
- TextView过长显示省略号, TextView文字中间加横线