[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: ポインターと参照




>  public void modify_string(String str) {
>    String tmp = str.substring(0,3);
>    str = tmp;
>  }

このときは、メソッド内部でいくら str を書き換えても、
このメソッドを終了すると結果は外部に反映されないです。

 >  public static void main(String[] arg) {
 >    String str1 = "replacing";
 >    Test ts1 = new Test();
 >    ts1.modify_string(str1);
 >    System.out.println(str1);

Test#modify_string() に引き渡された str1 はただのコピーなので
受け取ったメソッド側で代入して書き換えることはできないです。

>  public void modify_array_string(String[] str) {
>    String tmp = str[0].substring(0,3);

ここで String#substring() で新たな String オブジェクトが生成され、
tmp に代入されます。

>    str[0] = tmp;

この代入以前には str[0] は
 >  public static void main(String[] arg) {
 >    String str2[] = new String[1];
 >    str2[0] = "replacing";
この main() 内で確保された "replacing" という文字列リテラルを
指していましたが、代入後はさっき tmp に代入された文字列
(String#substring() で生成されたもの) を指すことになります。

感想としては、
配列で操作すれば副作用(呼び出し側のオブジェクトの書き換え)のあるメソッドが書ける、
というのがわかって面白かったです。

多分 Java の仕様を決めた人は、副作用を持つメソッドは書かせたくなくて
今のような言語仕様を採用したのだと思います。
>  public void modify_string(String str) {
>    String tmp = str.substring(0,3);
>    str = tmp;
>  }
C/C++ プログラマーにとってこのメソッドが呼び出し側に副作用をもたらなさいのは
バグに思えるかも知れませんね。
------------------------------------------------------------------
遠藤靖之 (えんどう やすゆき) <yasuyuki@xxxxxxxxxx>
http://www.freepage.total.co.jp/jfriends/ (Java互助会ホームページ)
株式会社タイムインターメディア 情報通信サービス部 TEL 03-5362-9009
〒162-0065 新宿区住吉町3-11 新宿スパイアビル      FAX 03-5362-9008