私は2つのシナリオに出くわしました。Objectを引数として渡す方法は、Arrayを引数として渡す方法と異なりますか?
配列がメソッドの引数として渡され、呼び出されたメソッドで配列が更新された場合、呼び出し元のメソッドにも反映されます。
しかし、2番目のシナリオでは、Stringオブジェクトが引数として渡されます。オブジェクトは呼び出されたメソッドで更新されますが、呼び出し元のメソッドには反映されません。
どちらの場合でも、(参照の)値が引数として渡されても、2つの違いは何かを理解したいと思います。下記のスニペットをご覧ください。
シナリオ1:
class Test {
public static void main(String[] args){
int a[] = {3,4,5};
changeValue(a);
System.out.println("Value at Index 1 is "+a[1]);
}
public static void changeValue(int b[]){
b[1] = 9;
}
}
出力:ここ
Value at Index 1 is 9
、アレイa
に関する基準(メモリアドレス)changeValue
に渡されます。したがって、b
はa
と同じアドレスを指しているだけです。 したがって、私がb[1]
またはa[1]
と言っても、同じメモリアドレスを参照しています。
シナリオ2:
public class Test {
public static void main(String[] args){
String value = "abc";
changeValue(value);
System.out.println(value);
}
public static void changeValue(String a){
a = "xyz";
}
}
が出力:私はここに同じロジックを適用した場合
abc
、文字列オブジェクトの値の参照(メモリアドレス)がa
で受け取っているchangeValueに渡されています。 したがって、a
は、VALUEと同じメモリ位置を参照する必要があります。したがって、a="xyz"
を実行すると、が"xyz"
に置き換えられます。
誰かが私の理解が間違っている箇所を指摘できますか?前もって感謝します!!
ここでは、不変性は赤ちゃんです。 –
はい、本当に、この場合は全く問題ではありません。編集。 – fge