好吧,我發現了什麼是如下所示:
返回實際返回值並將其複製到String a=obj.go();
,然後執行到最後。
讓我們通過以下實驗進行驗證。
public class Test2 {
public static void main(String[] args) {
Test2 obj=new Test2();
String a=obj.go();
System.out.print(a);
}
public String go() {
String q="hii";
try {
return q;
}
finally {
q="hello";
System.out.println("finally value of q is "+q);
}
}
程序的輸出爲
最後的Q值是你好
HII
,如果我們採取的,而不是字符串的StringBuffer如下,
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test2 obj=new Test2();
StringBuffer a=obj.go();
System.out.print(a);
}
public StringBuffer go(){
StringBuffer q=new StringBuffer("hii");
try{
return q;
}
finally{
q.replace(0, q.length(), "hello");
System.out.println("finally value of q is "+q);
/*return q1;*/
}
}
}
輸出comesout是,
最後Q的值是你好
你好
,最後,如果我們採取的int,而不是字符串如下,
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test2 obj=new Test2();
int a=obj.go();
System.out.print(a);
}
public int go(){
int q=1;
try{
return q;
}
finally{
q=2;
System.out.println("finally value of q is "+q);
/*return q1;*/
}
}
}
輸出是
最後Q的值是2
**Ananlysis**
1.In第一種情況下,返回字符串的複製ADRESS在可變一個,然後excecution去最後在哪裏字符串被改變。但是,既然在字符串的情況下,我們不能操縱任何字符串一個新的字符串構造。所以在變量一個原始字符串的地址被保存,它被打印。
2.在第二種情況下,返回變量a中的StringBuffer的複製地址,最後對該StringBuffer對象進行操作,而不是創建新的地址。所以存儲在變量a中的值也被操縱,這在打印語句中可見。
3.在第三種情況下,將int的值複製到變量a中,然後執行到最後。因此a得到1的值,然後在最後我們改變了值q,其仍然不改變值a。
您可能想閱讀:http://stackoverflow.com/questions/65035/in-java-does-return-trump-finally –
局部變量'q'的值已更改爲「hello」,是。但你回來的是「hii」。 – maksimov
請看我的新答案...讓我們嘗試更加細化這個概念.. – Ahmad