Java值传递之用swap()方法为什么不能交换new出来的字符串对象?

自己写了一个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两个对象并没有影响!你传进去的是他们的值,也就是地址,在没有返回值的情况下,并不会对实际对象产生影响。