2012-02-28 10 views
10
public class J { 

    public Integer method(Integer x) 
     { 
      Integer val = x; 
      try 
      { 

        return val; 
      } 
      finally 
      { 
        val = x + x; 
      } 
     } 
     public static void main(String[] args) 
     { 
      J littleFuzzy = new J(); 
      System.out.println(littleFuzzy.method(new Integer(10))); 
     } 

} 

"10"を返します。catchステートメントのreturn文の動作

戻り値の型IntegerをStringBuilderに置き換え、出力を変更しました。

public class I { 

    public StringBuilder method(StringBuilder x) 
     { 
      StringBuilder val = x; 
      try 
      { 

        return val; 
      } 
      finally 
      { 
        val = x.append("aaa"); 
      } 
     } 
     public static void main(String[] args) 
     { 
      I littleFuzzy = new I(); 
      System.out.println(littleFuzzy.method(new StringBuilder("abc"))); 
     } 


} 

出力は "abcaaa"

だから、誰もが詳細に私を説明することができますか。? 違いは何ですか?

+0

私のマシンでこのプログラムを実行すると、私も混乱します。最初のケースでは10を返します(20を返すと予想していました)、2番目のケースではabcaaaが返されています(これは追加したものです)。私はまた、この行動に困惑しています。 (私はその間にupvoted whoではない)まだ – JProgrammer

+0

それは良い質問です。ベーシックの思い出をいくつか戻しました。それのどこが悪いんだい ? – Siddharth

答えて

4

ちょうどそうimmutableの整数ための方法は、値は、それが反映されていない方法で変更され、そしてStringBuilderオブジェクト

EDITに反映しない場合であっても戻った後:

public class J { 
    public String method(String x) { 
     String val = x; 
     try { 
      return val; 
     } finally { 
      val = x + x; 
     } 
    } 

    public static void main(String[] args) { 
     J littleFuzzy = new J(); 
     System.out.println(littleFuzzy.method("abc")); 
    } 
} 
+0

いいえ、文字列は整数と同じですが、それは不変なので、私の編集例を参照して実行してください。 –

+0

'finally valの外側に' return val; 'を置き、' Integer'でも値を変更した場合は – Shahzeb

+0

@ Nirmal-thInkbeYond、これが本当ですか?戻り値は渡されたパラメータ、つまり 'x'と常に同じであると思います。 'StringBuilder'メソッドの場合、' append() 'メソッドを呼び出すことによってxの値が変更されたので、返された値に反映されます。 StringBuilderメソッド(StringBuilder x)の場合、 'val = x.append(" aaa ");'をval = new StringBuilder( "aaa");で変更してみてください。 –

0

StringBuilderの主な操作は、任意の型のデータを受け入れるようにオーバーロードされるappendおよびinsertメソッドです。それぞれは、与えられたデータを文字列に効果的に変換し、その文字列の文字列を文字列ビルダーに追加または挿入します。 appendメソッドは、ビルダーの最後に常にこれらの文字を追加します。 insertメソッドは指定されたポイントに文字を追加します。

たとえば、zが現在の内容が "start"の文字列ビルダーオブジェクトを参照する場合、z.append( "le")メソッド呼び出しは文字列ビルダに "startle"を含むようにしますが、z.insert (4、 "le")は "starlet"を含むように文字列ビルダーを変更します。

一般に、sbがStringBuilderのインスタンスを参照する場合、sb.append(x)はsb.insert(sb.length()、x)と同じ効果を持ちます。すべての文字列作成ツールには容量があります。文字列ビルダに含まれる文字シーケンスの長さが容量を超えない限り、新しい内部バッファを割り当てる必要はありません。内部バッファがオーバーフローすると、自動的に大きくなります。

StringBuilderのインスタンスは、複数のスレッドで使用することはできません。このような同期が必要な場合は、StringBufferを使用することをお勧めします。

上記の方法では、finallyブロックが毎回呼び出しています。

0

オブジェクトその参照のコピーが渡され、内容が変更可能な場合は内容を変更することができます。

関連する問題