• ベストアンサー

参照・値渡しについて

下記プログラム(ソース1)を実行すると「1」という値が出力されます。しかし、2行目をprivate static int a;とすると「0」という値が出力されます。 オブジェクトは参照渡しで基本データ型は値渡しと思ったのですが、2行目の値をString型で行ったところ全く変更されていない値が出力されました。(ソース2) 一体どういうことでしょうか? 回答のほどよろしくお願い致します。 (ソース1) public class X{ private static int a[] = new int[1]; public static void main(String []args){ modify(a); System.out.println(a[0]); } public static void modify(int a[]){ a[0]++; } } (ソース2) public class X{ static String a = "a"; public static void main(String []args){ modify(a); System.out.println(a); } public static void modify(String a){ a = "b"; } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ソース1: int a[] = new int[1] で、newを使っていますよね。 つまり、オブジェクトたちと同じ。つまり、参照渡し。変更される。 int a は、値渡し。つまり、変更不可。 ソース2: modifyで a = "b"; は、 char data[] = { 'b' }; a = new String(data); のことなので。 mainでは a -> "a" modifyでは a -> "b"(新しく、別な場所に生成) となっています。 modifyから戻れば、a -> "a"になります。 modifyのaはローカルなので。 変更するには、オブジェクトaの中身を変えなければなりません。 つまり、生成済みのものを変更する必要があります。 この場合、新しくnewすることになるので、 元領域"a"は変更されません。

yukikundesuyo
質問者

お礼

回答ありがとうございました。 Stringクラスは中身が変えられないから値渡しの様に見えるということが分かりました。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

私自身、昔似たような質問をしました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=708770

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=708770
yukikundesuyo
質問者

お礼

回答ありがとうございました。 おかげで良く分かりました。

関連するQ&A

専門家に質問してみよう