首页 > 其他 > 详细

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

时间:2014-01-24 07:30:41      阅读:268      评论:0      收藏:0      [点我收藏+]

今天写程序时发现,当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()的机制

原文:http://blog.csdn.net/chenlei0630/article/details/18710371

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!