其实画一个内存图就很清楚了,但是这里不能上传图片...
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 中存在址传递,传递进函数中的地址里所保存的值可以被改变
第一次调用swap(name0, name1);方法的时候,只是在方法内部交换了局部变量name0,name1的值,全局变量name0, name1的值并没有交换,System.out.println(name0 + "," + name1);打印出来的是全局变量的值。
方法swap(name);方法交换的是数组name里面的引用的地址,即name0,name1指向的地址发生了交换,System.out.println(name[0] + "," + name[1]);打印出来的是他们交换之后的值。
在java里面有引用型变量和值型变量,数组本身就是引用型的变量,传递过去的当然是应用了,其实你可以写一个类,然后创建一个类的对象,然后再swap一下,不过你的swap方法要变一下,要交换对象里的值才可以,交换引用是没用的也是传的引用。呵呵
引用传递的是对象的地址,值传递的是变量的值
使用引用传递,被调用函数使用的是调用函数传入的对象本身,也就是说在被调用函数中对对象进行修改将直接导致外部对象的值被修改。
而值传递,传递进去的是变量的副本(即拷贝),此时在被调用函数中对形参的任何修改都不会改变外部变量的值。
引用你可以直接理解成对象的别名。例如有有函数Test(String str);对象String name;
调用Test:Test(name);
则在Test里面str其实是name外部变量的别名,他们所代表的是同一个对象,所以Test函数修改str即修改name