FC2ブログ
HOME   »  スポンサー広告  »  スポンサーサイト   »  Java  »  [Java]メソッドの引数がStringの場合の挙動

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Java]メソッドの引数がStringの場合の挙動

以前の記事「値渡しと参照渡し」で書き切れなかった、メソッドの引数がStringの場合の挙動について。
public class Main {
    public static void main(String[] args) {
        String testString = "ABC";
        System.out.println("メソッドに渡す前の文字列:" + testString);
        method(testString);
        System.out.println("メソッドに渡した後の文字列:" + testString);
    }

    private static void method(String testString) {
        testString = testString + "DEF";
        System.out.println("メソッドで処理した後の文字列:" + testString);
    }
}
3行目で変数testStringに"ABC"を代入し、5行目でmethodメソッドに引数として渡している。
methodメソッドの中では、仮引数testStringに"DEF"を付加している。

上記の実行結果は以下の通り。


メソッドに渡す前の文字列:ABC
メソッドで処理した後の文字列:ABCDEF
メソッドに渡した後の文字列:ABC


Stringは参照型の為、引数として渡される(コピーされる)のは文字列そのものではなく参照情報である。
なので他の参照型と同様に、呼び出し先での処理が呼び出し元にも反映されそうに思うが、メソッドに渡す前と後で文字列が変化していない。

実はStringはイミュータブル(immutable)なオブジェクトで、生成した後に変化させること(文字列を追加で付加する等)ができない。
では、10行目の「testString = testString + "DEF";」はどういう処理になるのか
これは、右辺のtestString(処理前)の参照先文字列"ABC"に文字列"DEF"を付加した新たな文字列を生成し、その文字列に対する参照情報を左辺のtestString(処理後)に代入している。
従って、呼び出し元の実引数testStringの参照先文字列("ABC")と呼び出し先の仮引数testStringの参照先文字列("ABCDEF")は違う文字列になり、上記の実行結果の様になる。

呼び出し元で生成した文字列に対して呼び出し先で処理を行いたい場合も当然あり得るが、その場合はStringBuilderクラスやStringBufferクラスを使用する。
StringBuilderクラスやStringBufferクラスはミュータブル(mutable)なので、生成後に変化させることができる。
public class Main {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder("ABC");
        System.out.println("メソッドに渡す前の文字列:" + stringBuilder.toString());
        method(stringBuilder);
        System.out.println("メソッドに渡した後の文字列:" + stringBuilder.toString());
    }

    private static void method(StringBuilder stringBuilder) {
        stringBuilder.append("DEF");
        System.out.println("メソッドで処理した後の文字列:" + stringBuilder.toString());
    }
}
3行目で文字列"ABC"からStringBuilderクラスのインスタンスを生成し、5行目でmethodメソッドに引数として渡している。
methodメソッドの中では、仮引数stringBuilderに"DEF"を付加している。

上記の実行結果は以下の通り。


メソッドに渡す前の文字列:ABC
メソッドで処理した後の文字列:ABCDEF
メソッドに渡した後の文字列:ABCDEF


10行目で呼び出しているStringBuilderクラスのappendメソッドは文字通り文字列を付加する処理である為、仮引数stringBuilderの参照先は変わらない。
従って、呼び出し先での仮引数への処理=呼び出し元の実引数への処理となり、methodメソッドに渡す前と後で呼び出し元の文字列が変化している。


関連記事
Comment
Trackback
Trackback URL
Comment Form
管理者にだけ表示を許可する
プロフィール

まさお

Author:まさお
プログラミングは趣味レベルなので、お手柔らかに。

ブログランキング
ブログランキング参加中。是非クリックお願いします。


にほんブログ村 IT技術ブログ Androidアプリ開発へ

人気ブログランキングへ

ブログランキング



ブログ王

ブログランキング【ブログの惑星】

プログラム人気ブログランキング
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。