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.   

    你在swap()方法体中
    System.out.println(s1);
    System.out.println(s2);
    可以看到s1和s2确实是交换了,但出了这个方法体,s1、s2还是原来的基本数据类型作为参数传递的时候,在方法体内可以改变其值,出了其所在方法体之后,其值不变;对象作为参数传递的时候,其实传的是引用,在方法体内可以改变引用所指向的对象(不是改变它所指的对象的值,而是让它指向另一个对象),但出了其所在的方法体之后,它仍指向其原来的对象,但如果在方法体内改变引用所指向的对象的值,那出了其所在的方法体后,它所指向的对象的值就变成了在方法体内时改变的值。
      

  2.   

    你那样做行不通的。在函数里只是对你的两个字符串产生了两个新reference,你改变了这两个reference的指向,而原来的reference没有改变!所以不行的
      

  3.   

    同意netwebs的,primitive只是传值,只有对象才是传引用的。
      

  4.   

    java都是传值的
    就算是引用也是传引用的“值”
    所以在函数swap中的s1和s2与main中的是不同的变量
    只不过刚开始他们指向同一个String
      

  5.   

    是不是创建holder类来"在方法体内改变引用所指向的对象的值"啊?
      

  6.   

    内部的s1,s2只是拷贝了外部的s1,s2所指向的地址.然后在函数中,让s1指向外部的s2,这是可以的. 但问题是,外部的s1,s2仍然指向原来的地址.
      

  7.   

    关键一点: String对象一旦创建就无法改变,任何操作只能产生新对象.
      

  8.   

    但是要让输出的结果是:
    Second
    First该如何呢?
      

  9.   

    在Java中,对于基本数据类型(int ,float,...),参数是以传值的方式传递。
              对于对象类型(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 时所指向的值。
      

  10.   

    你只能用手工的重复的代码做,不能使用函数代替。public class try1{
    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;
    }
    }
      

  11.   

    用swap交换两个字符串是一定不可以实现的,
    java对于对象实际上是传递类似于地址的东西
    譬如
    public static void swap(String s1,String s2){
    String temp=s1;
    s1=s2;//实际上,原来s1所指向的对象并没有改变,这里是改变了s1的指向
    s2=temp;//同样只是改变了s2的指向,没有改变原来的值
    }如果java里面你传递Vector之类的对象进去,然后调用什么add之类的方法,返回之后,
    这些操作是会生效的,因为add没有改变这个Vector的指向,但是改变了所指向的这个
    对象的实际内容
      

  12.   

    Java全是传值的,没有传引用这回事.所谓"传引用",其实是传对象引用的值,实质上就是对象指针的值,被调方法的形参保存的是实参的值的副本,如果实参是对象,那么,形参是与实参指向同一个对象的另一个引用.
      

  13.   

    java中参数传递参数都是通过应用的方式,而没有提供传值的方法