本篇文章为大家展示了深入浅析java项目中返回语句的执行顺序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强>原题强>
尝试{}里有一个返回语句,那么紧跟在这个尝试后最终的{}里的代码会不会被执行,# 63;什么时候被执行,# 63;在返回前还是后,# 63;
<强>栗子代码强>
公共静态void main (String [] args) { int=测试结果(); System.out.println(结果); } 公共静态int测试(){ int t=0; 尝试{ 返回t; 最后}{ + + t; } }
<>强分析一下强>
<代码>测试()代码>方法内,在尝试中返回了t,那么在主方法中<代码>测试()代码>函数的返回值应该是t=0时,即控制台输出0
但是因为有最后的存在,而最后中对t进行了自增运算,并且最终会在尝试中的返回语句之前执行,所以正确的情况是控制台输出1
所以你最终确定的答案是:控制台输出1
然而事实并非如此,将程序跑起来之后,得到的结果是:
输出0
将栗子跑起来亲眼看一下吧~
得到这个结果你也许要爆炸了,啥? java规范说的都是错的? !
不用急,到我给太阳洗地的时间了
在洗地之前,你很有必要先理java中解的值传递,如果你已经了解该内容可略过下面这一个小节点
<强> java中的值传递强>
由于这只是本文内容引申出去的知识点,不过多赘述,随便唠两句,能借此明白则好,不明白希望借助搜索引擎明白一下。
在java的方法调用中,时常需要传递参数,那么传递的参数是将之前的变量直接传递给方法内了吗?
显然不是的,调用方法传递参数的时候,传递的只是原变量的一个副本(复制体),换句话说就是,将变量的值传递给了方法体,而并没有真正的将变量传递进去。
看个栗子:
公共静态void main (String [] args) { int t=0; 测试(t); System.out.println (t); } 公共静态int测试(int) { 一个=111; }
正确输出是0,因为<代码>测试()代码>方法内拿到的,只是t的一个副本(复制体)而并不直接是t, <代码>测试()代码>内改变了一个的值,并不影响t的值
以上是对于基本数据类型,如果对于对象呢?
如果参数是对象,那么传递的是对象的引用的副本(复制体),这也就是为什么在方法体内对对象进行修改,会真正的改变对象。因为方法体外的引用和方法体内的引用指向的是堆内存中的同一个对象,传递的是对象的引用
如果这里还不能理解值传递,建议先理解一下这一个概念再继续往下看
<强>真的开始分析了强>
为了你看着方便,栗子代码再来一份:(我真的不是为了凑字数)
公共静态void main (String [] args) { int=测试结果(); System.out.println(结果); } 公共静态int测试(){ int t=0; 尝试{ 返回t; 最后}{ + + t; } 李}
- <>当代码执行到返回t;时,并不是直接将t返回了出去,而是将t保留了起来(因为还有一个最后语句块没有执行!)并且这个保留,就是值传递性质的一个保留,也就是保留的是t的一个副本(复制体),我这里先叫他tt吧(不是套套! !)李> <李>接下来执行最后语句块,最后中将t做了自增运算,t的确变成了1,但是这并没有影响t的复制体tt的值!保留起来的tt值还是0 !李> <李>这个时候执行完了最后,正式将保留起来的tt返回出去,于是,整个函数的返回结果就是0 李> <李>这个t的副本(复制体)保留的地方是哪儿呢?我查了半天,有个应该靠谱的说法,保留在函数栈中,但具体保留的区域叫什么,我也不知道,还请知情大佬指教一下。
李,>
上图或许直观一点吗?
那么如果,这个t是一个对象呢?按照前面说的值传递的问题,如果t是一个对象,在最后中对t进行修改,那么最终返回出去的t所显示出来的数据,应该是经过修改的。
写一个类人来检验一下吧
{公共类测试 公共静态void main (String [] args) { 人=测试结果(); System.out.println (result.age); } 公共静态人测试(){ 人t=new (); t。年龄=0; 尝试{ 返回t; 最后}{ t.age + +; } } } 类人{ int年龄; }深入浅析java项目中返回语句的执行顺序