2011-07-19 12 views
1

私はJava文字列が不変であることを知っています。しかし、私が下の関数を実行すると、出力は私が期待するものではありません。文字列不変性質問

public static void main(String[] args) { 
     String s = "wicked"; 
     String [] ss = new String [1]; 
     ss[0] = "witch"; 
     modify(s, ss); 
     System.out.println(s+" "+ ss[0]); 
    } 
    private static void modify(String s, String[] ss) { 
     s = "sad"; 
     ss[0] = "sod";   
    } 

私はそれがあることを期待通りに私が手出力はwicked sodではなく、wicked witch。それは、Stringオブジェクト自体を渡すのではなく、2番目の引数として配列リファレンスをmodify関数に渡しているからですか?いかなる説明も高く評価されます。

答えて

10

あなたは配列の内容を変更しました。配列は常に変更可能です。

この配列には、最初に "witch"という文字列への参照が含まれています。 modifyメソッドは、文字列 "sod"への参照を含むように配列を変更します。文字列自体は変更されていません。配列の内容だけです。

ss[0]の値が文字列ではないことに注意してください - それは、文字列へ参照です。)

+0

ありがとうございました。これは、文字列への参照でもありません。だから、ss [0]とどう違うのですか? – OckhamsRazor

+1

@OckhamsRazor: 's'に値を代入すると、パラメータの値だけが変更されます。 'ss [0]'に値を代入すると 'ss'が参照する配列の値が変更されます。 –

+0

ああ私はそうだと思います。つまり、配列そのものに文字列が保持されていません。むしろ、配列の内容は文字列への参照を格納しますか? – OckhamsRazor

1

はそれを私が修正するために第二引数 として配列リファレンスを渡していますので、 Stringオブジェクト自体を渡すのとは対照的に、関数ですか?

正確に。変更可能なオブジェクト(配列)への参照を渡しています。メソッドがこのオブジェクトを変更すると、変更はメソッドの外側に表示されます。

0

文字列をメソッドのパラメータを渡すことについては非常に良い記事をお読みください。しかし、新しい文字列全体を割り当てることができます。そして、これがあなたがここでやっていることです。

あなたは配列オブジェクトへの参照を与えています。そのため、配列の内容が変更されます。

関連する問題