编写一个可以克隆的类。并解释如下现象:
int[][] origin=new int[][]{{1,2},{3,4}};
int[][] cloned=(int[][])origin.clone();
cloned[0][0]=5;
cloned[0][1]=6;
System.out.println(origin[0][0]+origin[0][1]);
此时系统输出11而不是3。
而如下代码
int[] origin=new int[]{1,2};
int[] cloned=(int[])origin.clone();
cloned[0] =5;
cloned[1] =6;
System.out.println(origin[0] +origin[1]);
此时系统输出3而不是11。两者都采用克隆方法,为什么结果不一样?

解决方案 »

  1.   

    Java中,数组也是一种对象
    int[][] origin=new int[][]{{1,2},{3,4}};
    这行代码等同以下代码:
        int[] a = new int[] {1 , 2} ;
        int[] b = new int[] {3 , 4} ;
        int[][] origin = new int[2][2] ;
        origin[0] = a ;
        origin[1] = b ;
    clone之后,实际只复制数组的第一维,也就是
    int[][] cloned=new int[2][2];
    cloned[0]=origin[0];
    cloned[1]=origin[1];所以实际上这两个多维数组都指向了a、b这两个数组
      

  2.   

    Use String is not a good manner! It's less safe than use Class type!
      

  3.   

    这是个比较深层次的问题:因为数组是一个特殊的类型,我们看不到它的定义,也就无从知道它的clone是如何实现的!
    不过可以肯定的是数组类型重写了clone方法,并且所有的默认clone都是浅拷贝,所以你的
    问题提的非常好,之所以出现你上面的原因是因为你的数组元素是基本类型!如果你的数组类型是引用类型,并且是可变的(Date可以,String不行),那么即使是一
    维数组也是共享的,你不妨把int类型改为Date类型试试,通过set方法改变Date,你会
    得到想要的结果,证明数组的clone的确是浅拷贝,也会对克隆有更深的理解.