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