java数组问题

swap()方法体直接写在main方法中运行正确,调用的话就错了。求解!
public class bubblesort {
public static void swap(int a,int b){
int temp;
temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int i,j;
int [] array = new int[]{21,51,32,8,6,2,1,4,8,9};
for(i=0;i<8;i++)
for(j=0;j<8-i;j++){
if(array[j+1]<array[j]) swap(array[j],array[j+1]);
}
for(i=0;i<10;i++) System.out.print(array[i]+" ");
}
}

因为你没搞清楚内存的情况,所以会有这样的错误。打个比方,就你这办法
public class bubblesort {
public static void swap(int a,int b){
int temp;
temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int i=0,j=1;
swap(i,j)
System.out.println(i+","+j);
}
}
在这个方法中,i和j的值最终没有调换,因为他是在main中,如果你是在swap()方法中就调换了,你可以这么理解,当调用swap()方法时,产生了一个方法的形参,int a,int b;使a=i,b=j;然后再成了a=j;b=i,然后方法结束,所以对于mian()中的i,j是没有任何影响的追问

是对内存跟栈内存的错?
数组在JAVA里不是引用类型吗?
还是用静态数组跟动态数组的问题?
静态数组是基本数据类型,动态数组是引用类型?

追答

我推荐你看下李刚的疯狂java讲义,里面说的满清楚的,比如
public class bubblesort {
public static void swap(int a,int b){
int temp;
temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int[] a={1,2};
swap(a[0],a[1])
System.out.println(a[0]+","+a[1]);
}
}
首先mian方法是一个栈,他先定义了一个变量a,然后堆内存里面定义了个数组,然后把a指向了这个数组,调用swap()方法,有新建了一个栈,然后这个栈里新建了3个变量,分别是a,b,temp,然后因为他们是基本型,所以是吧数组第一个数的值赋予给a,这里不是引用,同理第二个数的值赋予给b,然后把temp的值用a的值赋予,a的值用b的值赋予,b的值用temp的值赋予,方法结束,swap()方法里面的数据结束,回到main()方法中,打印数组里面的第一个值和第二格值,所以说swap对数组根本没有影响,大概是这么个样

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-22
对于原始数据类型,即long、int、char等8中基本数据类型。参数传递是值传递。方法调用结束后,那个变量的值并没有发生变化。就是说,在参数传递的过程中,该变量的值在方法调用期间复制给形参,形参是局部变量,所以对形参做出任何修改在调用结束后都不会影响该变量的值。追问

那就是这个问题,JAVA中数组在什么情况下是引用类型?

追答

不知道怎么回答。数组定义的类型除过基本数据类型外,其他引用类型。

本回答被提问者采纳
第2个回答  2012-04-22
1.for循环里应该是数组的长度,你可能写错了
2.swap只是进行了值的交换,并没有对array数组中的数据进行交换,冰羽221说的非常正确
public class bubblesort {
public static void swap(int[] array,int a,int b) {
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
public static void test() {
int i,j;
int[] array = new int[] {21,51,32,8,6,2,1,4,8,9};
for (i = 0; i < array.length; i++) {
for (j = 0; j < array.length-i-1; j++) {
if(array[j+1]<array[j]) {
swap(array,j,j+1);
}
}
}
for (i = 0; i < 10; i++) {
System.out.println(array[i]+ " ");
}
}
public static void main(String[] args) {
test();
}

}追问

这么肯定对了,我想问问数组的细节问题,比如内存跟数据类型的问题
我看书上说数组是引用类型,是由数组元素的数据类型决定的吗?

追答

数据类型有基本数据类型和引用类型
所以说除了基本数据类型,其他都是引用类型。跟数组里的元素没有关系

第3个回答  2012-04-22
你写的应该是排序吧!写的也不对,swap方法实现不了,数组数据交换,因为调用方法,传的是数组的值,而不是引用
第4个回答  2012-04-22
你的数组里不是有10个数吗
for (int i = 0; i < 10; i++)
for (int j = i + 1; j < 10; j++)
if (array[j] > array[i]) {
int temp;
temp = array[j];
array[j] = array[i];
array[i] = temp;
}