[知识学习]java中clone()的机制

今天写程序时发现,当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));
输出结果一样。


[知识学习]java中clone()的机制

上一篇:jiffies计数器


下一篇:linux内核外部驱动模块编译报错ERROR: "******" [drivers/**.ko] undefined!