Java克隆,Object#clone()

在Java中要实现克隆很简单,只要在需要克隆的类实现Cloneable,并调用其clone方法即可。最简单的克隆如下

package cn.quinn.test;

public class TEST implements Cloneable {
public String id;
public T2 t2;
public static void main(String[] args) {
TEST t = new TEST();
t.id = "1";
try {
TEST t2 = (TEST) t.clone();
System.out.println(t);
System.out.println(t2);
System.out.println(t2.id);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}

}


打印结果为
cn.quinn.test.TEST@1fb8ee3
cn.quinn.test.TEST@61de33
1
可以看到t和t2已经不是一个对象,但是id值相同。

[size=x-large][color=red]Java中的克隆分为浅克隆和深克隆[/color][/size]
默认的克隆方法提供的为浅克隆,浅克隆表现方式如下


package cn.quinn.test;

public class TEST implements Cloneable {

public String id;

public T2 t2;

public static void main(String[] args) {
TEST t = new TEST();
T2 t21 = new T2(); //new一个属性对象
t.t2 = t21;//把T2的对象传给t
System.out.println(t21); //打印一下
try {
TEST t2 = (TEST) t.clone();
System.out.println(t2.t2); //克隆结果
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}

}


打印结果
cn.quinn.test.T2@61de33
cn.quinn.test.T2@61de33

两个对象完全相同,这就是浅copy,当更改克隆后的对象属性的值后会影响到克隆前的对象,因为它们是同一块内存地址。

在Java中如何实现深度克隆呢?

方法很多 可以重写属性类的clone方法 ,这样做不好的地方就是一旦对象属性过多就会写很多
最好的方法就是序列化和反序列化,不过所有的类和属性类都必须实现Serializable接口
如下

package cn.quinn.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TEST implements Cloneable, Serializable {

public String id;

public T2 t2;

@Override
protected Object clone() throws CloneNotSupportedException {
ByteArrayOutputStream byteout = null;
ObjectOutputStream out = null;
ByteArrayInputStream bytein = null;
ObjectInputStream in = null;
try {
byteout = new ByteArrayOutputStream();
out = new ObjectOutputStream(byteout);
out.writeObject(this);

bytein = new ByteArrayInputStream(byteout.toByteArray());

in = new ObjectInputStream(bytein);

return in.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
in = null;
}
} catch (Exception e) {
}
try {
if (bytein != null) {
bytein.close();
bytein = null;
}
} catch (Exception e) {
}
try {
if (out != null) {
out.close();
out = null;
}
} catch (Exception e) {
}
try {
if (byteout != null) {
byteout.close();
byteout = null;
}
} catch (Exception e) {
}
}
return null;

}

public static void main(String[] args) {
TEST t = new TEST();
T2 t21 = new T2(); //new一个属性对象
t.t2 = t21;//把T2的对象传给t
System.out.println(t21); //打印一下
try {
TEST t2 = (TEST) t.clone();
System.out.println(t2.t2); //克隆结果
} catch (CloneNotSupportedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

}




package cn.quinn.test;

import java.io.Serializable;

public class T2 implements Serializable{

private String t2;

public String getT2() {
return t2;
}

public void setT2(String t2) {
this.t2 = t2;
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值