现在的位置: 首页 > 综合 > 正文

引用传递和值传递

2013年03月21日 ⁄ 综合 ⁄ 共 650字 ⁄ 字号 评论关闭

问题:请输出下列程序结果。


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';
 }
}

结果:

 World and Cello


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

抱歉!评论已关闭.