[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