主要是这样的:定义一个静态类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);
}}

解决方案 »

  1.   

    说到底就是对clone不熟悉咯,
    你又没有重载clone方法,自然传的是原来对象的引用啦^_^
      

  2.   

    这个是因为你在不停地覆盖自己:
    Test2.intArray[0][0] = count;
    Test2.intArray[0][1] = count;
    这里一直在为静态变量赋值,然后呢其他地方时clone,这要是不一样就怪了
      

  3.   

    不是这样的吧,clone本来就是深拷贝。刚才查了一下 这个问题的原因:
     因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
      

  4.   

    clone 是深拷贝,clone出来的对象是新分配的移块内存。所以也不是这个原因哦。
      

  5.   


     list.add(temp2); 这行代码 ,你把temp2 换成 temp3 或者temp1 试试
      

  6.   

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

  7.   


    int[][] temp1 = Test2.intArray.clone();  //直接拷贝  ....不能正确的输出值
    int[][] temp2 = {{count,count}};        //分配一个新的地址....可以正确的输出值
    int[][] temp3 = new int [Test2.intArray.length][2];//分配一个新的地址.....不能正确list.add(temp1) 出来的值都是10是因为 java基础类型只认一维数组,二维数组 的clone返回的是引用,每次递归都将引用赋值给了 temp1 所以 list里面装的是引用,而不是值。temp3 虽然也分配了移块内存,但是后来也赋值了一个引用给temp3 ,所以temp3 与temp1 一样。temp2 是另外一块内存,所以输出正常