首先要明确Java都是按照值传递的。
public static void main(String[] args) {
String x = new String("aaa");
change1(x);
System.out.println(x);
System.out.println("--------------------------");
}
private static void change1(String x) {
x ="bbb";
}
输出的结果是:aaa
原因:当将x传递给change()方法时,将传递x值的复制品(引用)。
这时候change()方法里的x只是原来String x = new String("aaa");中x的副本。然后x="bbb",相当于x副本重新引用了一个"bbb",这与原来的x无关。
String和其他对象的不同:
public static void main(String[] args) {
StringBuilder str = new StringBuilder("aaa");
change2(str);
System.out.println(str);
System.out.println("--------------------------");
StringBuilder str2 = new StringBuilder("aaa");
change2_1(str2);
System.out.println(str2);
System.out.println("--------------------------");
List<String> ls = new ArrayList<>();
ls.add("aaa");
change3(ls);
System.out.println(ls);
}
private static void change2(StringBuilder str) {
str = new StringBuilder("ccc");
}
private static void change2_1(StringBuilder str2) {
str2.append("bbb");
}
private static void change3(List<String> ls) {
ls.add("ccc");
}
输出结果:
结论:Java在值传递的时候都会copy一个副本,关键是副本变量存储引用,而不是引用本身!!!如果我们真的需要改变对象的值。首先,对象应该是可变的,例如StringBuilder,List,各种自定义的entity等。。。其次,我们需要确保没有创建新对象并将其分配给参数变量,因为Java只传递值。