嗯,我发现如下,
String a=obj.go();
Return 实际上返回一个值,并且在执行到 finally 之前将其复制到 。
让我们通过以下实验来验证它。
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 的值是 hello
你好
如果我们采用 StringBuffer 而不是 String 如下,
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;*/
}
}
}
输出结果是,
最后 q 的值是 hello
你好
最后,如果我们采用 int 而不是 String 如下,
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
1
**Ananlysis**
1.在第一种情况下,在变量a中返回 String 的复制地址,然后执行到最后更改 String 的地方。但是由于在字符串的情况下,我们无法操作任何字符串,因此会构造一个新的字符串。因此,在变量中保存了原始字符串的地址,并打印出来。
2.在第二种情况下,在变量a中返回 StringBuffer 的复制地址,最后操作这个 StringBuffer 对象,而不是创建一个新对象。所以存储在变量a中的值也会被操纵,这在 print 语句中可以看到。
3.在第三种情况下, int 的值在执行到 finally 之前被复制到变量a中。因此a的值为 1. 然后最后我们改变了q的值,这无论如何都不会改变a 的值。