题目:
有Object1 Object2;写一个方法实现object1-->object2;object2-->o1 public class SwapObject {
public static void main(String[] args){
Object o1 = new Object();
Object o2 = new Object();
System.out.println("o1:"+o1.hashCode());
System.out.println("o2:"+o2.hashCode());
swap(o1, o2);//不可以
System.out.println("o1:"+o1.hashCode());
System.out.println("o2:"+o2.hashCode());
}
public static void swap(Object o1,Object o2) {
Object o = new Object();
o = o1;
o1 = o2;
o2 = o ;
}
}输出:
o1:14576877
o2:12677476
o1:14576877
o2:12677476这样写肯定是行不通的
所以请大家讲讲java中的值传递,引用传递 
顺便讲下有什么其它方法可以交换。

解决方案 »

  1.   

    沙发先占了:
    public class SwapObject {
    public static void main(String[] args){
    Object[] oArray = new Object[2];
    oArray[0] = new Object();
    oArray[1] = new Object();
    System.out.println("o1:"+oArray[0].hashCode());
    System.out.println("o2:"+oArray[1].hashCode());
    swapArray(oArray);
    System.out.println("o1:"+oArray[0].hashCode());
    System.out.println("o2:"+oArray[1].hashCode());
    }
    public static void swapArray(Object[] oArray){
    Object o = new Object();
    o = oArray[0];
    oArray[0] = oArray[1];
    oArray[1] = o;
    }
    }
    输出:
    o1:14576877
    o2:12677476
    o1:12677476
    o2:14576877
      

  2.   

    java里都是值传递
    所以在调用方法后是无法改变参数的值,只能改变参数的属性值
    所以 1 楼曲线救国了 将参数变成一个数组
    而需要对调的 2 个对象成了数组的 2 个属性值
    C# 中有引用传递
    C 里有双指针都可以做到这点
    java这边就只能像 1 楼那样了
      

  3.   

    java里的这个关于值传递和引用传递的概念与C语言中的相差无几,可以试着一同理解!!推荐谭浩强老师的《c语言程序设计》第三版   大有裨益!!
      

  4.   

    java里都是值传递,没有引用传递。4楼讲的很具体。
      

  5.   

    看此贴有趣,我也来发表一下我的正解吧:
       首先, 大家争论的一个话题是java中有没有引用传递。
               对于这个问题,可以分两个来表述。①:sun官方的表述是,都是只传值
                                               ②:很多书籍上表述的是基本类型传值,对象传引用那么到底是传值呢?还是传引用呢?其实大家都不要去被误导了。引用其实就是相当于一个指针了,它其实也是一个值0x****所以我觉得还是传值比较准确。而其他的书上所说的也不错。
        然后, 解决LZ的问题了吧。
               我觉得楼主可能对JVM对内存的管理还有待加强。每一个栈中的引用它的hashcode是不同的。而每一个栈中的数据也是私有的。如果你想改变的话是没门的。就像一楼的那样用数组来做的话它在栈中存取的就是同一个栈中的数据了(只是这个数据是引用的)。在同一个栈中的数据当然是可以交换的了约。所以我的解释就是如此了。希望你能明白我的良苦用心啊。半夜三更起来帮你回复。眼睛都肿了。如果还是不懂的话就私聊了吧!