晚上在写程序的时候需要用到交换数据,所以我就主类里面写了一个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中的传递问题导致的吗?实在是想不通。
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
java中的函数传递是值传递,也就是说,调用函数时,只是将实参的值传递过去,而并没有将实参的地址传递过去,所以在swap中的交换是不可能反映到外面的。
可以使用传递对象的方式实现交换(有点类似C语言的指针)。
以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。
若要交换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
swap(int[] data, int a, int b)这个数组指向的对象没有改变,改变的是它的数组值。换句话说这个数组没和其他的交换。
正确做法:
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的传递方式。楼上解答的很好了。