字符串交换的问题
public static void swap(String a, String b)
    {
        String temp = a;
        a = b;
        b = temp;
    }这样交换的是形参,不能改变实参,我可以理解,可是为什么下面的代码,通过定义一个类就可以成功呢?是因为改变了对象的内容吗?求教!
 //先定义一个类
class number{
        int test;
 }
 public Test{
     public void swap(number a,number b){
                        int temp=a.test;
                        a.test=b.test;
                        b.test=temp;
     }
 }

解决方案 »

  1.   

    java的基本数据类型是分配在栈上的,而引用类型是分配在堆上的。
    String改变的是引用地址,你可以理解。
    为什么对象可以成功?因为你在对象里定义的int是基本数据类型!好吗!跟对象有毛关系哟!
    484傻!
      

  2.   

    楼主需要再去看一下java-数据类型....
      

  3.   

    写错了如果是这样呢
    class Myclass {
     public static String str1;
     public static String str2;
    }public class Demo {
     public static void main(String[] args) throws Exception {
      Myclass s = new Myclass();
      s.str1 = "111";
      s.str2 = "222";
      change(s);
      System.out.println(s.str1);
      System.out.println(s.str2);
     } public static void change(Myclass s1) {
      String temp = s1.str1;
      s1.str1 = s1.str2;
      s1.str2 = temp;
     }
    }
      

  4.   

    String a = "A" ,b = "B";
    第一种方式,public void swap(String a1,String b1)
    方法内a1是a的地址,b1是b的地址。
    String temp = a1;//temp为a1地址
    a1 = b1;//a1为b1地址;
    b1 = temp;//b1为temp地址。
    这里你只交换了a1, b1的地址,所以最终输出的结果还是a="A",b="B";第二种方式
    Myclass s = new Myclass();
    s.a = "A";
    s.b = "B";
    public static void change(Myclass s1)
    这里s1指向的是s的地址。
    你在方法内交换了s1两个参数的值,但是s1的地址没有变。
    s的输出结果是a="B",b="A"应该是这样,跑一下看看。所有输出结果正确那我说的没错,如果错了那就是我在胡说。
      

  5.   

    非常感谢你的细心解答,我还是有点疑问:
    方法一我改变了a1,b1指向的地址,对输出实参a,b没有影响。可是在s2中我改变的也是s1,输出的也是s呀,为什么引用s1的改变会影响到s呢。s.a="A"与s="A"在对对象"A"的引用时有什么不同吗
      

  6.   

    非常感谢你的细心解答,我还是有点疑问:
    方法一我改变了a1,b1指向的地址,对输出实参a,b没有影响。可是在s2中我改变的也是s1,输出的也是s呀,为什么引用s1的改变会影响到s呢。s.a="A"与s="A"在对对象"A"的引用时有什么不同吗
    方法1中你交换了a1,b1的地址,而不是a1,b1地址的值。所以a,b输出不受影响。
    方法二你改变的是s1的值,但是并没有改变s1的地址,所以s1和s还是同一个引用。
      

  7.   

    public class Test{
    public static void main(String[] args) {
    String a = "a";
    String b = "b";
    //swap(a, b); 相当于:
    {
    String a1 = a;
    String b1 = b;
    String temp = a1;
    a1 = b1;
    b1 = temp;
    } //出来之后a还是a,b还是b。和a1,b1无关。
    Myclass s = new Myclass();
    s.str1 = "111";
    s.str2 = "222";
    //change(s);相当于
    {
    Myclass s1 = s;
    String temp = s1.str1;
    s1.str1 = s1.str2;
    s1.str2 = temp;
    } //出来后s和s1指向的是同一个对象。而这个对象已经被修改了

    //总结:你无法改变传入方法之前的引用指向的对象。但是你可以去改变那个对象(比如它的变量)
    }
    public static void swap(String a1, String b1) {
    String temp = a1;
    a1 = b1;
    b1 = temp;
    }
    public static void change(Myclass s1) {
    String temp = s1.str1;
    s1.str1 = s1.str2;
    s1.str2 = temp;
    }
    }
    class Myclass {
    public static String str1;
    public static String str2;
    }
      

  8.   

    string s="abc"方式定义的字符串内存地址分配在栈上,和定义基本类型变量一样。
    string s=new string()方式定义的字符串对象内存地址分配在堆上