Stringクラスのオブジェクトの場合
Stringクラスのオブジェクトをメソッドに渡した場合、メソッド側の引数には同じオブジェクトの位置が渡されるのは配列と同じですが、文字列変数に新しい文字列を代入するとまったく別の場所にオブジェクトが新しく作成され、その新しい場所の位置がメソッド内の変数に代入されます。その為、元の場所には元の文字列が格納されたままなのでメソッド呼び出し元の文字列には何も影響を与えません。
String.java
public static void main(String[] args) {
String str = "abc";
test(str);//先にここのtext()が実行される
System.out.println(str);
}
private static void test(String str) {
str = "def";
System.out.println(str);
}
実行
def
abc
List
参照型の変数の場合は、final修飾子をつけても値の変更が可能になってしまいます。
このように参照型の変数を引数に使う場合は、呼び出し元の値が変わるため注意してください。
List.java
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
finalSample(list);
System.out.println(list);
}
public static void finalSample(final List<String> list) {
// public static void finalSample(List<String> list)
list.set(0, "A");
list.set(1, "B");
list.set(2, "C");
}
実行
[a, b, c]
[A, B, C]