黑马程序员技术交流社区

标题: 这地方有没有更好的解释, [打印本页]

作者: 何明辉    时间: 2012-9-13 11:16
标题: 这地方有没有更好的解释,
本帖最后由 何明辉 于 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的事。

作者: 马睿    时间: 2012-9-13 11:39
本帖最后由 马睿 于 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能改变




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2