秦彬桂
2017-04-04 04:28
采纳率: 100%
浏览 2.1k
已采纳

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();应该是生成在堆中,为什么也交换不了呢?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • 桐爷哥 2017-04-04 11:08
    已采纳

    其实这道题画图很容易理解,图片说明
    你直接将x指向内存的地址赋给a, y赋给b, 然后在方法中,交换了a,b指向的对象。但是并没有对x,y进行操作,他们依旧指向原来的对象,所以并没有交换x与y.我讲的可以理解吗?

    点赞 打赏 评论
  • 群居的山羊 2017-04-04 05:27

    你应该是理解错了,String和new String之间区别不大,String是如果之前池中有相同字符串,那变量指向该字符串,而new String是无论有没有都直接创建一个新字符串

    点赞 打赏 评论
  • 群居的山羊 2017-04-04 06:14

    补充一下,就算是引用类型你这么传递也是传递不了的,因为你传递引用类型对象的时候他还是会给你创建一个对象,只不过他和你给的对象指向一个地址,所以你能通过这个对象改变原来对象中变量的值。但是如果你想要交换两个引用变量的话是不能用你的方法的,那样只会让方法中的两个变量指向的地址互相交换,而原来的变量地址不会有任何改变。
    如果你想要交换值或者对象的话我想到两个办法,一个是创建一个外面的对象,比如你要交换两个值

     //先定义一个类
    class number{
            int test;
     }
     public Test{
         public void swap(number a,number b){
                            int temp=a.test;
                            a.test=b.test;
                            b.test=temp;
         }
         //这样在主方法中调用就可以交换了
     }
    
    

    数组的话你就直接通过索引交换就行了,其实这两个方法实质都是一样的

    点赞 打赏 评论
  • qq_32295869 2017-04-04 08:15

    一句话,你交换的是行参,对实参没影响,函数调用只是把实参复制给了形参,其实就是引用地址,但是注意的是你如果使用形参改变了引用的对象,实参引用的对象也跟着变,因为它们指向的是同一个地址,就是同一个对象

    点赞 打赏 评论
  • TuringK 2017-04-04 11:34

    其实并没有多复杂,你调用方法时传入的是x y的值,值传递对x和y两个对象并没有影响!你传进去的是他们的值,也就是地址,在没有返回值的情况下,并不会对实际对象产生影响。

    点赞 打赏 评论

相关推荐 更多相似问题