问题:请输出下列程序结果。
public class Test_value {
public static void main(String[] args) {
String str=new String("World");
char[] ch={'H','e','l','l','o'};
change(str,ch);
System.out.print(str+" and ");
System.out.println(ch);
}
public static void change(String str,char[] ch){
str="Change";
ch[0]='C';
}
String str=new String("World");
char[] ch={'H','e','l','l','o'};
change(str,ch);
System.out.print(str+" and ");
System.out.println(ch);
}
public static void change(String str,char[] ch){
str="Change";
ch[0]='C';
}
}
结果:
World and Cello
分析:所有的函数调用本质上都是“值传递”,也就是说函数的形参的值只是实参的一个“副本”,关键在于实参是什么类型(是基本类型则传递值给副本,若是对象引用则传递引用值给副本)。
本题中String是当成值来传递的,因为java不像c或c++那样可以传递字符串的地址给形参,只能通过返回值改变。如果把值当做一个仓库的话,函数就是在某个空地(栈)开辟一块空间复制了一个一模一样的仓库。假设原来的仓库为A,后面的为B。当str="Change"时只是改变了仓库B里面的东西。
而数组为传递的是地址。好比说传入的是一个仓库的钥匙,现在通过形参复制了一把一模一样的钥匙,指向同一个仓库。当ch[0]='C'时相当于通过这把钥匙改变了仓库的东西。等形参钥匙的寿命结束(函数结束),再用主钥匙打开仓库时就会发现东西已经改变。