java clone机制

Arrays.copyOf(T[ ] original, int newLength)
System.lang.arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);
都是浅复制
实际上, 前者是调用了后者:
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
}

例子:
public class Test implements Cloneable{
 private int x;
 public void setX(int x)
 {
  this.x = x;
 }
 public int getX()
 {
  return x;
 }
 
 public Test(int x)
 {
  this.x = x;
 }
 
 public Object clone()
 {
                       try {
                  Test t = (Test)super.clone();  //先执行浅克隆,确保类型正确和基本类型及非可变类类型字段内容正确

                  t.setX(x);
  return t;
                       } catch (CloneNotSupportedException e) {
  e.printStackTrace();
  return null;
       }
 }
}

public static void main(String[] args)
{
     Test[] tests = new Test[3];
     tests[0] = new Test(2);
     tests[1] = new Test(2);
     tests[2] = new Test(2);
     
     Test[] ts = Arrays.copyOf(tests, 3);  //[1]

     tests[0].setX(10);

     for(Test tt : tests)
      System.out.println(tt.getX());
     for(Test t : ts)
      System.out.println(t.getX());
}
输出为:
10
2
2
10
2
2
若将[1]处代码修改为:
     Test[] ts = new Test[3];
     System.arraycopy(tests, 0, ts, 0, 3);
输出依然为:
10
2
2
10
2
2
若将[1]处代码修改为:
     for(int i=0; i<tests.length; i++)
      ts[i] = (Test)tests[i].clone();
输出则为:
10
2
2
2
2
2

转载于:https://www.cnblogs.com/simply-zhao/archive/2008/04/12/1150057.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值