public class Test {
private String name;
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
private static  void swap(Test a,Test b){
System.out.println("swap a="+a+" name:"+a.getName());
Test temp;
temp=a;
a=b;
b=temp;

System.out.println("swap a="+a+" name:"+a.getName());

}
public static void main(String[] args){
Test a=new Test();
a.setName("xiaobao");
Test b=new Test();
b.setName("dabao");
System.out.println("before swap a:"+a+" "+a.getName());
swap(a,b);
System.out.println("after swap a:"+a+" "+a.getName());
}}为什么不能交换俩个参数的值?

解决方案 »

  1.   

    因为java只有传值,没有穿引用。但是也不是绝对的不能交换,使用反射,还是可以修改String里的内容的。
      

  2.   

    sorry,看错了,还以为你是要交换String的值呢。    private static  void swap(Test a,Test b){
            System.out.println("swap a="+a+" name:"+a.getName());
            Test temp;
            temp=a;
            a=b;
            b=temp;
            
            System.out.println("swap a="+a+" name:"+a.getName());
            
        }
    这段改为    private static  void swap(Test a,Test b){
            System.out.println("swap a="+a+" name:"+a.getName());
            String temp;
            temp=a.getName();
            a.setName(b.getName());
            b.setName(temp);
            
            System.out.println("swap a="+a+" name:"+a.getName());
            
        }
      

  3.   

    这种情况下只能修改不能交换。深深理解java是值抟递的,此题中该值就是引用。
      

  4.   

    楼主到底是要交换什么值啊?这个问题应该是考查的JAVA参数传递是值传递还是引用传递
      

  5.   

    交换swap方法中参数的值!
    谢谢楼上几位了,等下去借点关于这方面的书看下!
      

  6.   

    楼主是否是想通过SWAP交换两个引用 来达到交换值 的目的?这样是不行的。
    private static  void swap(Test a,Test b){
            System.out.println("swap a="+a+" name:"+a.getName());
            Test temp;
            temp=a;
            a=b;
            b=temp;
            
            System.out.println("swap a="+a+" name:"+a.getName());
            
        }
    //这里的交换只是对swap里面的引用进行交换,并没对主方法内的两个引用进行交换,主方法的引用还是没有变,所指向的内存空间还那一块。
    可以参考下面的链接
    http://www.wangchao.net.cn/bbsdetail_74064.html在java和C++中都采用了引用这个概念,但是二者的行为并不一样。java的引用其实更象c++中的指针,而非c++中的引用。或许是java之父James Gosling认为指针这个概念就意味着一种不安全,就没有用指针这个名词.的确c++的指针给我们带来强大威力的同时,也给我们带来了危险,大多的攻击也都是利用指针让系统崩溃。在许多书上都没有见到关于java中reference行为的更详细的探讨,本文便从与c++的的区别谈起:
      一.先看java中的引用:
      class Person
      {
      private String name;
      public Person(String name)
      {
       this.name=name;
      }
      public String getName()
      {
       return name;
      }
      public void setName(String name)
      {
       this.name = name;
      }
      }
      现产生两个对象 :
      Person p1=new Person("Zhangsan");
      Person p2=new Person("Lisi");
      引用Person p=p1,p1=p2;
      测试结果p.getName(): Zhangsan;
      p1.getName():Lisi;
      P2.getName :Lisi;
      而在c++的引用中
      其结果应该都是Lisi即p2的name(因为p1的改变会影响p);
      上述结果显示:在java中referece其行为就是c++中的指针,而不是c++中的引用.
      但是java的referece是一种安全的指针,不仅受到编译器的保护,还受到执行系统的保护。但java没有“指针”运算。
      二、java中的参数传递问题--By value or By reference
      java中的参数传递都是采用by value.其实这句话是个笼统的说法,如果不加思索或许不能理解其真正的含义。
      首先说什么是by value,by value是指在参数结合的时候,形参是否是实参的一个副本,如果产生这个副本那么
      我们说是by value,否则我们说是by reference.
      java中的基本类型和c、c++语言一样采用by value传参是毋庸置疑的。
      那么java有在参数传递的时候有没有by reference?回答是否定的。java中的一切类型在传递参数的时候都是传
      值的。
       首先,我们想想c++和java中的对象有什么区别?其实没有什么区别,只是java中的对象必须由reference来
      持有,而c++的对象可以单独存在。那好,那就让我们看看java是怎么传递对象的:
      public static void swap(Person person1, Person person2) // doesn't work
      {
       Person temp = person1;
       person1 = person2;
       person2 = temp;
      }
      Person a = new Person("Alice");
      Person b = new Employee("Bob");
      swap(a, b);
      能工作么?不能。为什么?
      我们看看:
      当我们传递参数的时候,我们传递的是对象么?不,是对象的一个句柄(引用、“指针”)。java的对象只能
      由引用来持有。如果你对c++熟悉,那么上面的过程我们翻译过来:
      static void swap(Person *person1,Person *person2)
      {
       Person *temp = person1;
       person1 = person2;
       person2 = temp;
      }
      Person *a = new Person("Alice");
      Person *b = new Person("Bob");
      swap(a,b);
      这两段代码产生的行为是一样的,都不能正常工作(即无法完成我们的交换工作)。
      那我们先想想c++是怎么实现对象的交换的?你或许一口就说出使用引用和指针做参数。但是上面的参数是指针
      作为参数呀!原因在于:在c++中我们传递的参数的确能是对象:
      Person a("Alice");
      Person b("Bob");
      swap(a,b);
      这样可以成功完成交换动作.
      前两段的代码不能工作的原因在于:
       但我们传递实参的时候,我们传递的是指针("指针"),传递的过程,指针("指针")进行了复制,如下图示:
      a--->对象1<----a'(其中a',b'分别为a,b在传递参数的时候产生的副本)
      b--->对象2<----b'
      进入函数体后副本发生了交换,如下图示:
      a-->对象1<---b' 
      b-->对象2<---a'
      我们可以看出a和b安然无恙的指向了原来的对象.这就是产生上述结果的原因.
      但java可以在函数体内修改对象的值:
      static void changName(Person person)
      {
      person.setName("Bob");
      }
      changName(a);
      对java传递参数总结:
      1)一个方法不能够修改一个基本类型的实参的值
      2)一个方法可以改变对象的状态.
      3)一个方法不能让实参引用指向另一个对象.
      

  7.   

    有兴趣的话看看这个帖子中的回复:http://topic.csdn.net/u/20090523/21/c6c9028b-04de-4aef-8b9e-f63e8eb29864.html