main方法中的s1,s2 swap方法中的s1,s2都是句柄
1.s1指向实例“first”,s2指向实例"second";
2.调用swap(s1,s2)时,复制了两个句柄_s1,_s2;_s1指向实例"first",_s2指向实例"second";
3.调用完毕,交换了_s1,_s2,但s1,s2并没有改变
1.s1指向实例“first”,s2指向实例"second";
2.调用swap(s1,s2)时,复制了两个句柄_s1,_s2;_s1指向实例"first",_s2指向实例"second";
3.调用完毕,交换了_s1,_s2,但s1,s2并没有改变
System.out.println(s1);
System.out.println(s2);
可以看到s1和s2确实是交换了,但出了这个方法体,s1、s2还是原来的基本数据类型作为参数传递的时候,在方法体内可以改变其值,出了其所在方法体之后,其值不变;对象作为参数传递的时候,其实传的是引用,在方法体内可以改变引用所指向的对象(不是改变它所指的对象的值,而是让它指向另一个对象),但出了其所在的方法体之后,它仍指向其原来的对象,但如果在方法体内改变引用所指向的对象的值,那出了其所在的方法体后,它所指向的对象的值就变成了在方法体内时改变的值。
就算是引用也是传引用的“值”
所以在函数swap中的s1和s2与main中的是不同的变量
只不过刚开始他们指向同一个String
Second
First该如何呢?
对于对象类型(String ,Integer,Float,...),参数传递的都是引用。
但是在Java中有很多的非可变的对象,比如String ,Integer,Float ,BigInteger 等等,
这些对象在创建之后,其值便不可修改,对于所有可能修改其值的操作,这些对象都会返回一个新的对象,而并不改变其原来的值。例如:
String s1="123";
String s2="456";String s0=s1; // s0==s1s1+=s2; // s0!=s1 !!!!! 实际上等价于 s1=new String(s1+s2),
所以在你的程序的swap(String s1,String s2)里,你无法通过引用 s1 修改 s1 所引用的值,实际上只是修改了这个引用(即 s1),让新的 s1 指向新的值。至此,s1 便不再指向你传入 s1 时所指向的值。
public static void main(String args[]){
String s1="First";
String s2="Second";
String temp=s1;
s1=s2;
s2=temp;
System.out.println(s1);
System.out.println(s2);
}
public static void swap(String s1,String s2){
String temp=s1;
s1=s2;
s2=temp;
}
}
java对于对象实际上是传递类似于地址的东西
譬如
public static void swap(String s1,String s2){
String temp=s1;
s1=s2;//实际上,原来s1所指向的对象并没有改变,这里是改变了s1的指向
s2=temp;//同样只是改变了s2的指向,没有改变原来的值
}如果java里面你传递Vector之类的对象进去,然后调用什么add之类的方法,返回之后,
这些操作是会生效的,因为add没有改变这个Vector的指向,但是改变了所指向的这个
对象的实际内容