自己写了一个Swap测试类,代码如下:
public class Swap5
{
public static void main(String[] args)
{
// String x = "x111";
// String y = "y111";
String x = new String("x111");
String y = new String("y111");
swap(x, y);
System.out.println(x);
System.out.println(y);
}
public static void swap(String a, String b)
{
String temp = a;
a = b;
b = temp;
}
}
运行结果:
x111
y111
注释部分运行结果也是一样。
用字面值方式给字符串赋值是生成在String Pool(字符串池)中,交换不了可以理解,但是new String();应该是生成在堆中,为什么也交换不了呢?
其实这道题画图很容易理解,
你直接将x指向内存的地址赋给a, y赋给b, 然后在方法中,交换了a,b指向的对象。但是并没有对x,y进行操作,他们依旧指向原来的对象,所以并没有交换x与y.我讲的可以理解吗?
你应该是理解错了,String和new String之间区别不大,String是如果之前池中有相同字符串,那变量指向该字符串,而new String是无论有没有都直接创建一个新字符串
补充一下,就算是引用类型你这么传递也是传递不了的,因为你传递引用类型对象的时候他还是会给你创建一个对象,只不过他和你给的对象指向一个地址,所以你能通过这个对象改变原来对象中变量的值。但是如果你想要交换两个引用变量的话是不能用你的方法的,那样只会让方法中的两个变量指向的地址互相交换,而原来的变量地址不会有任何改变。
如果你想要交换值或者对象的话我想到两个办法,一个是创建一个外面的对象,比如你要交换两个值
//先定义一个类
class number{
int test;
}
public Test{
public void swap(number a,number b){
int temp=a.test;
a.test=b.test;
b.test=temp;
}
//这样在主方法中调用就可以交换了
}
数组的话你就直接通过索引交换就行了,其实这两个方法实质都是一样的
一句话,你交换的是行参,对实参没影响,函数调用只是把实参复制给了形参,其实就是引用地址,但是注意的是你如果使用形参改变了引用的对象,实参引用的对象也跟着变,因为它们指向的是同一个地址,就是同一个对象
其实并没有多复杂,你调用方法时传入的是x y的值,值传递对x和y两个对象并没有影响!你传进去的是他们的值,也就是地址,在没有返回值的情况下,并不会对实际对象产生影响。