JAVA传参
从sql = sql.replace说起.
sql.replace后sql值不变,String 是不可变的。replace是返回一个新值,用新的值去表示变化。
public static void change(String a) {
a = "bbb";
}
public static void change2(StringBuilder a) {
a.delete(0,2).append("ccc");
}
public static void main(String[] args) {
String a = "aaa";
change(a);
System.out.println(a);
StringBuilder sb = new StringBuilder("eeee");
change2(sb);
System.out.println(sb);
System.out.println(a);
}
可见String没被改变
StringBuilder被改变
解释:
java传递的都是指针副本,String用例中,String 副本指向一个新的String,(String不可变),所以结束后旧副本还是指向老的String。StringBuilder用例中,传递引用副本后,对引用所指的内存进行了更改,旧副本指向的老的StringBuilder对象被更新。
总结起来,java传递的是对象的引用副本,对于可以变对象,通过引用更新了内存。对于不可变对象,通过引用无法更新,即使=赋值也是开辟一块新内存,然后副本指向新内存,旧内存不变。