java中引用传递和值传送的区别

来源:互联网 发布:pdf 编辑软件 编辑:程序博客网 时间:2024/06/05 11:52
public class Note {
 public static void main(String args[]) {
  String name[] = { "Killer", "Miller" };
  String name0 ="Killer";
  String name1 = "Miller";
  swap(name0, name1);
  System.out.println(name0 + "," + name1);
  swap(name);
  System.out.println(name[0] + "," + name[1]);
 }


 public static void swap(String name[]) {
  String temp;
  temp = name[0];
  name[0] = name[1];
  name[1] = temp;
 }


 public static void swap(String name0, String name1) {
  String temp;
  temp = name0;
  name0 = name1;
  name1 = temp;
 }
}


输出结果: 


Killer,Miller

Miller,Killer


其实画一个内存图就很清楚了
swap(String name0, String name1)
可以写成这样考虑
swap(String str0, String str1)
发现了吗?其实你传入参数的过程是将str0和str1分别指向name0和name1所以引用的地址,也就是说方法里构造了两个新的字符串,而你所做的赋值操作都是对新字符串的引用地址的改变...方法退出后name0和name1还是指向原来的地址,并没有发生任何改变...(字符串类型是一个比较特别的类型,其中还涉及到字符串的不变性,在这里你可以把它考虑成简单数据类型)


swap(String name[]) 
也可以这样考虑
swap(String str[])
进入方法后构造了一个数组对象str[],并将str指向name的地址(强调:此时str和name指向同一内存地址),也就是说你对str[0],str[1]的改变就是在对name地址中name[0],name[1]的改变 


真的很难表述清楚,自己画个内存图就很清晰了(理解的关键是:形参是新对象,而且新对象是指向传入对象的地址)
ps:  java 中不存在址传递,重新赋值其实是重定向
     C 中存在址传递,传递进函数中的地址里所保存的值可以被改变

0 0
原创粉丝点击