在java数组中,可以把一个低维数组赋给更多维数的数组,比如:int[][] a = new int[3][4];
int[][] b = new int[2][6];
int[][][] c = new int[4][][];
c[1] = a;
c[2] = b;这是可以理解的,因为只对c的最高维进行的初始化,那样最高维的元素可以指向任意的二维数组,但是请看下面的情况:
int[][] a = new int[8][9];
int[][] b = new int[2][6];
int[][][] c = new int[4][2][1];
c[1] = a;
c[2] = b;这样赋值也是同样可行的,我就觉得很奇怪了,上面那个例子可行是因为c的后二维没有初始化,而这里已经做了完全的初始化,对数组的每一维都指定了明确的大小,也就是说,空间已经分配了,默认值0也赋给了每一个元素,这时候为什么还是可以指向任意的二维数组呢?那原来分配好的空间是否会被回收?是否可以认为高维元素是类似于指针的参量,所以即使全部初始化,但仍可以指向任意的二维数组呢?

解决方案 »

  1.   

    c初始化之后c[1]应该是指向自己的[2][1]了吧?
    然后你把a句柄付给了这个c[1],c[1]就指向了和a一样的内存了?
    我得理解,等高人的答复
      

  2.   

    如果你是用clone()的话,估计就会出越界错误。
      

  3.   

    int[] a 和C一样,应该是一个指针一样的东西。所以2维数组的高位应该就是所谓存放低位数组句柄的句柄组。
      

  4.   

    应该是int[][][] c = new int[4][2][1];
    这样只是被定义了,并没有分配给c存储空间。等到赋值得时候再给他分配存储空间。
    我记得好像是这样,拿不准。错了别见怪1
      

  5.   

    如果是下面的代码你就不奇怪了:
    Object[] a;
    a[0] = Object1;
    a[0] = Object2;如果 Object1 = new int[8][9];
    Object2 = new int[2][6];
    a = new int[4][2][1];
    就可以解释你的问题了。理解这个问题的关键是多维树组其实是一个Object数组,而Object的类型是维数-1的数组。
    a = new int[4][2][1];
    相当于
    a = new Object[4]; //(Object: int[][])
    a[0] = new int[2][1];
    a[1] = new int[2][1];
    a[2] = new int[2][1];
    a[3] = new int[2][1];
    后来a[0] = new int[8][9];
    结果是把原来a[0]的int[2][1]丢弃了。
      

  6.   

    哦,taolei大侠一讲解茅塞顿开呀,看来还是要充分理解数组就是对象这句话的含义,现在我就明白了,谢谢谢谢!