以下时个人观点:
Java 传参数传的是引用,并且是使用 final 修饰了参数。这导致不能将引用指向另一个对象。
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("a", "a");
change1(map);
System.out.println(map.size()); // 输出结果 1
change2(map);
System.out.println(map.size()); // 输出结果 2
}
// 直接将参数指向另一个对象,不会修改原参数
public static void change1(Map map) {
map = new HashMap<>();
}
// 修改内容,可以修改参数
public static void change2(Map map) {
map.put("b", "b");
}
在传参数时,在不修改参数的指向的前提下,修改其内容就可以修改原参数。
String 是不可变的类型,当值发生改变是,会生成新的对象,并将指针指向新的对象,所以通过以上方法修改不了参数值。
public static void main(String[] args) {
String str = "a";
change1(str);
System.out.println(str); // 输出结果 a
change2(str);
System.out.println(str); // 输出结果 a
change3(str);
System.out.println(str); // 输出结果 ab
}
// 改变值,实际已经指向了新的对象,不会修改原参数
public static void change1(String str) {
str += "b";
}
// 指向新的对象,不会修改原参数
public static void change2(String str) {
str = new String("ab");
}
// 通过反射修改值,可以修改原参数
public static void change3(String str) {
Field valueField = null;
try {
valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
char[] ch = {'a', 'b'};
valueField.set(str, ch);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}