5

このコードを確認してください

   public class StringbuilderDoubt {

    public static void main(String args[]){
           new StringbuilderDoubt().methodTest();
    }

    public void methodTest(){
        String str=new String("Default");
        StringBuilder sb=new StringBuilder();
        sB1(str,sb);
        sB2(str,sb);
        System.out.println(str+".........."+sb);
    }
    private void sB1(String str1, StringBuilder sb1){
                    str1+="str1";
                    sb1.append("sB1");
    }

    private void sB2(String str2, StringBuilder sb2){
        str2+="str2";
        sb2.append("sB2");
    }
}

出力は次のとおりですDefault..........sB1sB2 。StringBuilderが参照渡しのように機能するのはなぜですか。methodTestでは、2つのオブジェクトstringとstringbuilderを渡します。文字列は値渡しですが、StringBuilderは、メソッドの呼び出しからの参照渡しとStringBuilderオブジェクトが変更されたように見えます。

4

3 に答える 3

3

StringBuilderインスタンスをメソッドに渡すと、インスタンス値は値によって渡されます。これまで見てきたように、インスタンス値を返さずに、メソッド内のStringBuilderインスタンスに文字を追加できます。

必要に応じてStringBuilderインスタンス値を返すこともできますが、必須ではありません。変わっていません。

この「参照渡し」は、ほとんどのコレクションクラス(リスト、マップ)、およびゲッターとセッターを持つ独自のクラスでも機能します。

この動作を望まない場合は、渡すインスタンスのディープコピーを作成する必要があります。これは、パブリックAPIからCollectionクラスを返す場合に行います。

于 2013-02-11T17:42:58.853 に答える
1

ここには何の問題もありませんStringBuilder

参照によって参照される文字列には何も起こりませんstrsB1メソッドには、ローカル参照がありますstr1。「+=」演算子は新しい文字列を返しますが、不変である元の文字列は変更されません。同じことがあなたのsB2メソッドでも起こります。

したがって、変数strには「デフォルト」のみが含まれています。

于 2013-02-11T17:42:29.303 に答える
1

参照で渡されるためです。への参照StringBuilderは値によって渡されます。文字を追加することができ、メソッドが戻った後、それらはインスタンスに含まれます。コレクションを渡し、invokeメソッド内に値を追加するのと同じ方法で、これらは保持されます。セッターを呼び出したり、パブリックフィールドを割り当てたりすることもできます。このような変更は、戻った後も保持されます。

への参照Stringも値によって渡されるため、メソッドが戻った後、この参照に新しい値を割り当てても効果はありません。

于 2013-02-12T07:44:21.777 に答える