java中数据交换的问题 1C

晚上在写程序的时候需要用到交换数据,所以我就主类里面写了一个swap,
但是在调用之后发现数据没有交换成功,可是在swap里面数据的确交换成功了呀,
不知道是什么原因,下面贴出代码:

    public static void main(String[] args){
        int a,b;
        a = 4;
        b = 5;
        swap(a,b);
        System.out.println(a+","+b);
    } 
     public static void swap(int a, int b){
        int temp = a;
        a = b;
        b = temp;
     }

麻烦各位看看到底是什么问题啊,是因为java中的传递问题导致的吗?实在是想不通。

7个回答

public static void main(String[] args){
    int a,b;
    a = 4;
    b = 5;
    swap(a,b);
    System.out.println(a+","+b);
} 
    光看上面这段代码,打印出的a,b当然还是原来的值,他们在这里是局部变量,值根本就没有变么,swap只是去调用了一下方法,对数据交换没有任何返回,必然得不到想要的结果。
    看看这个帖子http://bbs.csdn.net/topics/300151805
yuanpengfred
Fred_k 根本原因不是局部变量的问题,而至java中的传递问题,在这里因为是简单类型,所以是值传递。不过还是谢谢你的回复。
接近 4 年之前 回复

java中的函数传递是值传递,也就是说,调用函数时,只是将实参的值传递过去,而并没有将实参的地址传递过去,所以在swap中的交换是不可能反映到外面的。
可以使用传递对象的方式实现交换(有点类似C语言的指针)。

havedream_one
havedream_one 回复Fred_k: java中只有值传递。只不过基本类型的时候,传递的是数值;对象的时候传递的是引用的地址
接近 4 年之前 回复
yuanpengfred
Fred_k 谢谢,不过到底是函数传递的时候是值传递,还是只是在简单类型的时候,函数传递的知识值传递?
接近 4 年之前 回复

以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。
若要交换a,b的值:

 public class Compare {

    public static void main(String[] args) {
        int a = 4;
        int b = 5;
        int[] data = { a, b };
        swap(data, 0, 1);
        a = data[0];
        b = data[1];
        System.out.println(a + "," + b);
    }

    public static void swap(int[] data, int i, int j) {
        int t = data[i];
        data[i] = data[j];
        data[j] = t;
    }
}

swap(int[] data, int a, int b) 方法在内部实际上是改变了 data 所指示的对象的成员数据。
可参考:http://blog.csdn.net/zw_2011/article/details/6431448

sunnyliqian
sunnyliqian 回复Fred_k: swap(int[] data, int a, int b)这个数组指向的对象没有改变,改变的是它的数组值。换句话说这个数组没和其他的交换。
接近 4 年之前 回复
yuanpengfred
Fred_k 谢谢,你说结果只是改变了拷贝的值,而不是源值,那岂不是你在swap里面传入的数组的源值还是不会改变,可是现在再使用这个数组的时候,值确实是已经改变了,以前我写过一个排序算法,也写过和这个一模一样的swap,但是今天晚上遇到这个问题,让我搞不明白了。
接近 4 年之前 回复

swap(int[] data, int a, int b)这个数组指向的对象没有改变,改变的是它的数组值。换句话说这个数组没和其他的交换。

yuanpengfred
Fred_k 明白了,传递的是对数组的引用,但是改变的是数组本身的值,而之前的只是改变了引用,而没有改变值,你发的那篇博客讲的很清楚,谢谢了,
接近 4 年之前 回复

正确做法:
public static void main(String[] args){
int a,b;
a = 4;
b = 5;
int temp = a; a = b; b = temp;
System.out.println(a+","+b);
}

说通俗点,Java里面的值传递,只是把4.5这两个值复制一份然后传给swap函数,所以在函数里面交换的只是那两个复制值,对外面的a.b是不会有影响的

很经典的例子,楼主好好学习下,理解Java的传递方式。楼上解答的很好了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!