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对象指向了一个新地址。
 

 

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务