小弟是java初学者,以下的程序是测试交换两个对象的方法实现。但是运行后却交换不了。我查阅了书,书中说java的参数传递类型只有“值传递”。那么如果想实现这样一个交换两个对象的方法具体应该怎么写呢?(我知道c++很容易实现的)
。谢谢回答。
public class mytest {  
  
    public static void main(String[] args) {          ObjectSample o1 = new ObjectSample("hello");  
   ObjectSample o2 = new ObjectSample("你好");
     
        System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());  
        swapObject(o1, o2);  
        System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());  
    }  
    static void swapObject(ObjectSample o1, ObjectSample o2){  
        ObjectSample temp = new ObjectSample("temp");  
        temp = o1;  
        o1 = o2;  
        o2 = temp;  
    }  
}  

class ObjectSample{  
    private String title;  
      
    ObjectSample(String title){  
        this.title = title;  
    }  
      
    public String getTitle(){  
        return title;  
    }  
}

解决方案 »

  1.   


    public class mytest { public static void main(String[] args) { ObjectSample o1 = new ObjectSample("hello");
    ObjectSample o2 = new ObjectSample("你好"); System.out.println("before swap o1:" + o1.getTitle() + " o2:"
    + o2.getTitle());
    swapObject(o1, o2);
    System.out.println("after swap o1:" + o1.getTitle() + " o2:"
    + o2.getTitle());
    } static void swapObject(ObjectSample o1, ObjectSample o2) {
    String tmp = o1.getTitle();
    o1.setTitle(o2.getTitle());
    o2.setTitle(tmp);
    }
    }class ObjectSample {
    private String title; ObjectSample(String title) {
    this.title = title;
    } public String getTitle() {
    return title;
    }

    public void setTitle(String title){
    this.title = title;
    }
    }
      

  2.   

    java中虽然可以叫“值传递” ,但是分开讲会更好些,对于基本数据类型我们叫“值传递”,对于对象叫“引用传递”更好。当然其实也都可以理解为“传值”。而你要交换的是属性的值,传递引用并不能改变其对象的属性和方法。当然那样是不行的。
      

  3.   

    java中对象是引用值的传递,你的
    System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());   
    swapObject(o1, o2);   //没有交换到
    System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());   
    }   
    static void swapObject(ObjectSample o1, ObjectSample o2){ //相当与在方法体中交换了两个局部的对象,对你上面的o1,o2没影响  
    ObjectSample temp = new ObjectSample("temp");   
    temp = o1;   
    o1 = o2;   
    o2 = temp;   
    }    
      

  4.   

    这样可以得到你的结果
    public class Mytest {   
       
    public static void main(String[] args) {    ObjectSample o1 = new ObjectSample("hello");   
    ObjectSample o2 = new ObjectSample("你好");
       
    System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());   
    swapObject(o1, o2);     
    }   
    static void swapObject(ObjectSample o1, ObjectSample o2){ 
    ObjectSample temp = new ObjectSample("temp");   
    temp = o1;   
    o1 = o2;   
    o2 = temp;   
    System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle()); 
    }   
    }    class ObjectSample{   
    private String title;   
      
    ObjectSample(String title){   
    this.title = title;   
    }   
      
    public String getTitle(){   
    return title;   
    }   
    }
      

  5.   

    回复"Crazy__yu"
    谢谢这么多人回答。这里的属性比较少只有一个,如果类的属性很多的情况就不可能一个一个属性的传值吧?就是想问有没有像c++那样直接用指针操作的方法呢?
    谢谢!
      

  6.   

    Java里面有只有值传递,如果Java基础类型直接传的就是基础类型的值,如果是引用类型传就是引用本身的值,在C++里面如果想修改指针参数的指向,那也得用双重指针或者说是指向指针的指针才能做到吧,
    如果真的想模仿这个效果,可以在你的对象做一个包装对象,然后包装对象传到函数里,再操作。public class Wrap{
        public Object o;
        public Wrap(Object o){
            this.o=o;
        }
    }
    static void swap ( Wrap o1,Wrap o2){
      Object temp=o1.o;
      o1.o=o2.o;
      o2.o=temp;
    }这样可以做到,就是要多一道操作。