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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章