[快乐开发] 关于在finally子句中赋值的问题分析
<>++<
2011-04-22
先引用一篇文章:使用javap分析finally块中return值 里面写了testInt() testRef() 以及testArr()三个方法 它们均在return之后的finally子句中对该对象进行了 直接 或间接 的重复赋值,但最后return得到的结果却不同。 目前讨论的结论是 return 使用一个单独的寄存器,return之后这个寄存器里的值不被修改了。 不过我觉得原因可能不是这样,因为jvm中的寄存器数量极其有限,不可能做到一个return使用一个单独的寄存器 --------------背景介绍完毕,下面是调查结果-------------------- 先收集的三则资料: 大概大家更多的疑问是在testRef()和testArr()的返回值上,两者均是引用类型,为什么返回值不同。 我觉得原因可能是这样:(目前只是猜测) 在testArr()方法中的 return x[0];这行 是调用了String类型的toString()方法,将返回值return,这个是基础知识,无需解释;而testRef()里的 return ref;这行也调用了Ref类中重写的toString()方法,那么两个toString()的不同点在于String的toString()的实现是 return this; 而Ref类中的toString()的实现是 return String.valueOf ( x );也就是说 testRef()和TestArr()返回的对象其实是不同的 一个是String类型x[0]对象本身 一个是Ref类中的全局变量x,所以在进入Ref类的toString()方法时 操作数栈就不同了 所以归纳为 testInt()和testArr()方法对应的寄存器保存的是当前操作数栈顶的值1,而testRef()对应的寄存器保存的是Ref类中toString()方法中操作栈顶的值2而不是当前操作栈顶的值1。进而testRef()的反编译代码中就没有出现ret指令。
结论是 只要赋值和return的是同一个对象 return语句执行后 该值就再也不变了 至于TestRef这个方法 赋值和返回的分别是ref.x和ref所以值被改变了 可参见:摸 !
|