return本质探究以及try-finaly下的return探究
return本质探究
其实reutrn语句本质上我们可以把它分为两步
1.return语句获取到变量的地址
2.return将获取的地址返回,也就是return本质是传地址
这里可以看下面的结果
try字符串的hashcode:115131
StringBuilder里的try的hashCode:1361960727
catch里面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());//--语句1
return too.num; //语句2
} finally {
too.num=new StringBuilder("finaly");//语句3
System.out.println("finaly的hashCode:"+too.num.hashCode());//语句4
}}}
class Too{
StringBuilder num=new StringBuilder("你好");
}
结果如下:
try字符串的hashcode:115131
StringBuilder里的try的hashCode:1361960727
finaly的hashCode:739498517
catch里面return语句返回的:try 返回值的hashCode:1361960727
finaly里面修改的: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对象指向了一个新地址。