今天写程序时发现,当String数组A在用Clone()方法将A的内容克隆给另一个String数组B时,此时得到的数组B的地址指向的是一个新的地址。既不是A的地址,也不是原来B的地址。这说明在调用Clone()方法时,该方法在后台创建了一个新的对象。
举个例子:
public static void main(String [] args){ String [] A = {"aa","bb"}; String [] B = new String [2]; System.out.println("A的地址是: "+A); System.out.println("复制前B的地址是: "+B); B = A; System.out.println("A直接赋给B时,B的地址是: "+B); B = A.clone(); System.out.println("Aclone给B时,B的地址是: "+B); }输出结果为:
A的地址是: [Ljava.lang.String;@15bc6c8 复制前B的地址是: [Ljava.lang.String;@578073 A直接赋给B时,B的地址是: [Ljava.lang.String;@15bc6c8 Aclone给B时,B的地址是: [Ljava.lang.String;@b20352
查看了一下Api:Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。
Object类中定义了clone()方法。对数组进行克隆。举例:
public static void main(String args[]){ int a[]=new int[5]; int b[]=new int[6]; Arrays.fill(b,1); a=b.clone(); System.out.println(Arrays.toString(a)); } 输出结果是: 1 1 1 1 1 1
克隆不仅是拷贝内容,还会把结构也给改掉。声明的数组a 只有5个内存空间,将b克隆赋给a后 b的数组大小也变为6了。可见clone方法时直接创建了新的对象。
对常量数组做如下测试:
final int a[] = new int[5]; int b[]=new int[6]; Arrays.fill(b,1); a=b.clone(); System.out.println(Arrays.toString(a)); 输出结果一样。