日期:2014-05-20  浏览次数:20695 次

一个java程序的疑问
主要是这样的:定义一个静态类list,在递归里往list里面放东西,每次放入的东西不一样,但是递归结束后发现list里面的每个元素都是一样的(值都与最后个相同)。



代码如下: rescusion 函数里面,temp1 temp2 temp3 赋值方式,只有list.add(temp2) 的时候才出现正确的结果。

想了两天了,还没想出原因



import java.util.ArrayList;
import java.util.List;


public class Test2 {


private static int[][] intArray;
/**
 * @param args
 */
private static List<int[][]> list;

public static void main(String[] args) {
// TODO Auto-generated method stub

list = new ArrayList<int[][]>();
int count=0;
intArray = new int[1][2];;
rescusion(count);
for(int i=0;i<list.size();i++) {
int a[][] = list.get(i);

System.out.print(a[0][0]+",");
}


}

private static void rescusion(int count) {

if(count>10) {
return ;
}
Test2.intArray[0][0] = count;
Test2.intArray[0][1] = count;
// Test2.intArray = {{0,0}};
//list.add(Test2.intArray.clone());
int[][] temp1 = Test2.intArray.clone();  //直接拷贝  ....不能正确的输出值
int[][] temp2 = {{count,count}};        //分配一个新的地址....可以正确的输出值
int[][] temp3 = new int [Test2.intArray.length][2];//分配一个新的地址.....不能正确的输出值
temp3 = Test2.intArray.clone();
list.add(temp2);
//list.add(temp2);
count+=2;

rescusion(count);
}

}


------解决方案--------------------
说到底就是对clone不熟悉咯,
你又没有重载clone方法,自然传的是原来对象的引用啦^_^
------解决方案--------------------
这个是因为你在不停地覆盖自己:
Test2.intArray[0][0] = count;
Test2.intArray[0][1] = count;
这里一直在为静态变量赋值,然后呢其他地方时clone,这要是不一样就怪了

------解决方案--------------------
首先temp2是个局部变量,另外数组是引用类型,你在递归调用的时候方法没结束,所以temp2的值后面引用会覆盖之前的引用,所以最后显示的都是8