A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何明辉 中级黑马   /  2012-9-13 11:16  /  1449 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何明辉 于 2012-9-13 11:53 编辑

class Demo112
{
public static void main(String[] args)
{
  System.out.println(get(4));
  
}
public static int get(int x)
{
  try
  {
   return x;
  }
  finally
  {
   //return x=x+1;//---1
   x=x+1;
  }
}
}
上面运行的结果是4,如果是1处运行的则是5,不大好理解。张老师举了个容器的列子,搞不懂,因为x虽为变量但装的是值,改变了那就是改变了,求更好的解释?谢谢!。我倒是实验总结了一下:对于finally语句中如果有返回语句则以最后执行到的该语句为准,如果没有则以之前的为准,是不是跟return关键字本身有关,而不是x的事。

评分

参与人数 1黑马币 +3 收起 理由
唐志兵 + 3 赞一个!

查看全部评分

1 个回复

倒序浏览
本帖最后由 马睿 于 2012-9-13 11:40 编辑

概念:return是在 finally之后执行的,而finally是无法改变返回值变量的

原理你可以视作如下

finally必须是在代码段最终执行,也就是说前面无论try还是catch…都会执行finally


而return实际执行过程可以视作是这样的原理:

当你定义public static int get(int x)时,函数get@int(= =反汇编的int不太懂。。抱歉,写不来便宜表达式。读书没读好……)t 有个索引哈希虚拟内存映射地址比如0x4c4b其地址索引下,有一个指向的返回值储存变量例如
比如此处变量名为get,也就是int get_return(是个专门用来放返还值的变量)

程序实际运行顺序(或许从汇编结构上是这样)
  try
  {
   return x;
  }
finally
{
   x=x+1;
}
/*
{
系统隐藏操作代码:
code:
提取get_return
}
*/


将x=4返回给了get,也就是get = 4了,注意,函数在汇编中传入参数的方法是stdcall压栈方式??,而调用函数后,程序返回值是从get指向的一个储存返回get的变量中提取

因此实际上return还是在finally之前执行的,但是由于实际提取的时候是提取的get,而不是看的return(get的指向返回值get_return,可以通过return改变)

因此你会看到return好似在finally之后执行的假象,因为隐藏了提取数据的步骤,而提取的get_retun只有return能改变

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马