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探究相关推荐

  1. caffe学习日记--lesson5: VS下新建工程,探究Blob

    caffe学习日记--lesson5: VS下新建工程,探究Blob 在VS2013下新建工程,探究caffe的数据结构Blob,并使用.熟悉caffe 1.新建空白的控制台应用程序,添加main.c ...

  2. 异常:catch下的return;

    import java.io.FileNotFoundException;public class TryCatchDemo {public static void main(String[] arg ...

  3. 计算机的本质:在信息的控制下,利用能量实现运算。(提高单位能耗的计算能力,一直都是IT业发展的方向)

    文章目录 前言 I .计算机的本质:在信息的控制下,利用能量实现运算. 1.1 Binary 1.2 Logic Gates 1.3 Building logic gates from transis ...

  4. java的tey语句return了_Java finally语句到底是在return之前还是之后执行?

    网上有很多人探讨Java中异常捕获机制try-catch-finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语 ...

  5. python中一个函数只允许有一条return语句_一个函数应该只有一个return语句吗?

    我经常在一个方法的开头有几个语句来返回"简单"的情况.例如,这个: public void DoStuff(Foo foo) { if (foo != null) { ... } ...

  6. 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 ...

  7. 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 ...

  8. python return函数_理解Python函数中的return关键字

    一.说明 return 语句是Python函数返回的结果,可以是数值.字符串.列表.表达式.函数等: return 语句将Python函数的结果,返回到调用的地方,并把程序的控制权一起返回,即在函数中 ...

  9. attempted to return null from a method with a primitive return type (int).

    错误产生的场景 dao层接口如下 int getResourceDataNumsByTitle(String title); mapper.xml 中sql语句如下 <select id=&qu ...

最新文章

  1. Data - 数据思维 - 中篇
  2. RDKit | 基于最大公共子结构(MCS)的分子比对
  3. 我们该怎么成为技术尖子生
  4. Mac 删除应用卸载后无法正常移除的图标
  5. Python爬虫常用模块
  6. 社交网络初探——链路预测
  7. php遍历多维数据库,PHP代码优化之array_column() 使用(解决循环嵌套Sql的问题)
  8. java 注释 代码,如何在Java中注释代码块
  9. WINDOWS上svn服务器自动部署
  10. 构造器模式(Builder模式)
  11. Uipath鼠标单击扩展教程
  12. 鸿蒙二部曲关系,用鸿蒙OS在蜂鸣器上放一曲《两只老虎》
  13. 全网最详细的Yolov3训练Caltech Pedestrain数据集并绘制fppi miss rate图
  14. printf输出二进制
  15. 微服务系列之单体架构
  16. 高三计算机教学总结,2021年高三信息技术教学工作总结范文.doc
  17. 个人微信号API接口搜集
  18. mac设置文件权限_如何在Mac上设置文件权限
  19. 2022最新软件测试面试题(附答案)来测试下你的水平
  20. TextView过长显示省略号, TextView文字中间加横线

热门文章

  1. 答案 石头剪刀布 编码过程 0912
  2. django-登装饰器
  3. django-模型类字段选项
  4. 作为一枚学生党,如何快速通过拉好友赚取生活费!
  5. WCF技术剖析之十七:消息(Message)详解(上篇)
  6. HTML5学习笔记简明版(8):新增的全局属性
  7. [转] Java中的容器
  8. 一个c++程序员一年前的生活笔记
  9. 十四个方法提高博客的页面访问量
  10. 一起谈.NET技术,WPF Ribbon 开发资料分享