- ベストアンサー
参照・値渡しについて
下記プログラム(ソース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"; } }
- みんなの回答 (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"は変更されません。
その他の回答 (1)
- sha-girl
- ベストアンサー率52% (430/816)
私自身、昔似たような質問をしました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=708770
お礼
回答ありがとうございました。 おかげで良く分かりました。
お礼
回答ありがとうございました。 Stringクラスは中身が変えられないから値渡しの様に見えるということが分かりました。