10秒目をつむったら…

下記プログラム(ソース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";
}
}

A 回答 (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"は変更されません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/22 20:13

私自身、昔似たような質問をしました。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=708770

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=708770
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/22 20:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!