结论:Java 是值传递,传递的不是字面意思上的数字或字符串值,而是地址值。
每次当主函数调用被调函数时,形参持有的的地址值与实参的地址值一致,也就是说形参与实参指向同一个堆中的内存。在被调函数中,如果形参一旦被=
赋值,形参持有的地址值会指向新值的地址,但实参的地址值不会改变。
用hashCode()
来表示地址值做一个例子:
public static void main(String[] args) {
String num = "one";
System.out.println(num.hashCode()); // 11082
setNum(num);
System.out.println(num.hashCode()); // 11082
}
public void setNum(String num) {
System.out.println(num.hashCode()); // 11082
num = "two"; // 这时形参num的地址值被改变
System.out.println(num.hashCode()); // 115276
}
那如果不用=
去给形参赋值,用对象自带的方法修改对象本身,你可以看出形参与实参对应的对象都被修改:
public static void main(String[] args) {
StringBuilder num = new StringBuilder("one");
System.out.println(num.hashCode()); // 23934342
setNum(num);
System.out.println(num.hashCode()); // 23934342
}
public void setNum(StringBuilder num) {
System.out.println(num.hashCode()); // 23934342
num.append("two"); // onetwo
// num = new StringBuilder("two") // 如果是该种情况,结果与第一个例子一致,形参的地址值变了
System.out.println(num.hashCode()); // 23934342
}