Ну, я нашел следующее,
Return на самом деле возвращает значение, и оно копируется в 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 — привет
привет
и если мы возьмем 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 — привет
привет
и, наконец, если мы возьмем 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, затем выполнение переходит к окончательному изменению строки. Но поскольку в случае строк мы не можем манипулировать какой-либо строкой, создается новая строка. Таким образом, в переменной a сохраняется адрес исходной строки, которая выводится на печать.
2. Во втором случае вернуть скопированный адрес StringBuffer в переменную a, и, наконец, этим объектом StringBuffer манипулируют, а не создают новый. поэтому значение, которое было сохранено в переменной a, также подвергается манипулированию, что видно в операторе печати.
3. В третьем случае значение int копируется в переменную a, прежде чем выполнение перейдет к finally. и, таким образом, a получает значение 1. а затем, наконец, мы изменили значение q, которое в любом случае не меняет значение a.
person
Ahmad
schedule
26.06.2012
q
было изменено на привет, да. Но то, что ты вернул, было привет. - person maksimov   schedule 25.06.2012