さて、私が見つけたのは次のとおりです、
Returnは実際に値を返し、 String a=obj.go();
実行が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の値はこんにちは
hii
次のようにStringの代わりに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;*/
}
}
}
出力は次のようになります、
最後にqの値はこんにちは
こんにちは
最後に、次のようにStringの代わりに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です
1
**Ananlysis**
1.最初のケースでは、変数aに文字列のコピーされたアドレスを返し、実行は最後に文字列が変更された場所に移動します。ただし、文字列の場合、文字列を操作できないため、新しい文字列が作成されます。したがって、変数には元の文字列のアドレスが保存され、印刷されます。
2. 2番目のケースでは、StringBufferのコピーされたアドレスを変数aに返し、最後にこのStringBufferオブジェクトを操作して、新しいオブジェクトを作成します。したがって、変数aに格納された値も操作されます。これは、printステートメントで確認できます。
3. 3番目のケースでは、実行がfinallyに進む前に、intの値が変数aにコピーされます。したがって、aは1の値を取得し、最後にqの値を変更しましたが、とにかくaの値は変更されません。