先貼代碼:
import java.util.HashMap;
import java.util.Map;
public class FinallyTest {
public static void main(String[] args) {
ObjectTest obj=new ObjectTest();
System.out.
StringTest str = new StringTest();
System.out.println("str=="+str.getValue());
StringObjTest strObj=new StringObjTest();
System.out.println("strObj=="+strObj.getValue());
IntegerTest integer=new IntegerTest();
System.out.println("Integer=="+integer.getValue());
}
}
class IntegerTest {
public Integer getValue() {
Integer j = new Integer(1);
try {
j=new Integer(10);
return j;
} finally {
j=j+new Integer(100);
}
}
}
class StringTest {
public String getValue() {
String j = "string_orgin";
try {
j="string_try";
return j;
} finally {
j = "string_finally";
}
}
}
class StringObjTest {
public String getValue() {
String j = new String("stringobj_orgin");
try {
j=new String("stringObj_try");
return j;
} finally {
j = new String("stringObj_finally");
}
}
}
class ObjectTest {
public Map<String, String> getMap() {
final Map<String, String> argMap = new HashMap<String, String>();
try {
argMap.put("tryKey", "2");
return argMap;
} finally {
argMap.put("finalKey", "2");
}
}
}
返回結果:
obj=={tryKey=2, finalKey=2}
str==string_try
strObj==stringObj_try
Integer==10
總結:在return返回之前 會將return的值拷貝一份,然后在執行finally,如果拷貝的變量類型是string、基本類型、包裝基本類型的Boolean Integer Double Long 因為這些類型都是不可變的,想要改變值只能拷貝一個原來的值,finally操作的值只是操作的一個拷貝, 但是如果是對象 那么因為拷貝的一個對象引用 finally會改變原來在堆中的對象,所以會影響return 值
PS:1、順序一定是執行try塊,在執行finally 但是因為return返回機制的原因 導致因為返回類型導致的數據不同
2、執行順序:1、在return前將數據壓入棧中(如果是Boolean Integer Double Long不可變類型或者string類型 直接將值壓進去,如果是可變的那么把堆中的地址引用壓進去)
2、執行finally語句,因為string和Boolean Integer Double Long為不可變類型變量,如果改變會另外申請一塊常量池內存,但是不會改變棧中的值,而對象的話因為是引用 所以Finally會改變其真實值
3、最后return棧中的值
新聞熱點
疑難解答