编写一个可以克隆的类。并解释如下现象:
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。两者都采用克隆方法,为什么结果不一样?
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。两者都采用克隆方法,为什么结果不一样?
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这两个数组
不过可以肯定的是数组类型重写了clone方法,并且所有的默认clone都是浅拷贝,所以你的
问题提的非常好,之所以出现你上面的原因是因为你的数组元素是基本类型!如果你的数组类型是引用类型,并且是可变的(Date可以,String不行),那么即使是一
维数组也是共享的,你不妨把int类型改为Date类型试试,通过set方法改变Date,你会
得到想要的结果,证明数组的clone的确是浅拷贝,也会对克隆有更深的理解.