Java 克隆分为浅克隆和深克隆
浅克隆:
将原型的所有属性的值复制到新对象,新对象基本数据类型的字段值的改变不会影响到被复制对象,而引用类型复制的是指向堆的引用地址,所以新对象和被复制对象的引用类型指的是同一个地址,任意一个改变,都会受印象
public class InfomationType implements Cloneable{
@SerializedName("TYPEID")
private String typeId;//类型ID
@SerializedName("TYPENAME")
public String typeName;//类型名称
@SerializedName("TIMES")
private String times;//显示时间段
@SerializedName("PARENTID")
private String parentId;//父ID
public XgMessageInfo xgMessageInfo;
public XgMessageInfo getXgMessageInfo() {
return xgMessageInfo;
}
public void setXgMessageInfo(XgMessageInfo xgMessageInfo) {
this.xgMessageInfo = xgMessageInfo;
}
public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getTimes() {
return times;
}
public void setTimes(String times) {
this.times = times;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
@Override
public Object clone() throws CloneNotSupportedException {
InfomationType infomationType=null;
try{
infomationType=(InfomationType)super.clone();
// infomationType.xgMessageInfo=(XgMessageInfo)xgMessageInfo.clone();
return infomationType;
}catch (Exception e){
}
return null;
}
}
}
public class XgMessageInfo implements Serializable {
private String id;
private String createTime;
private String createUser;
private String createUserName;
public String infoTitle;
private String type;
private String tenantId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getCreateUserName() {
return createUserName;
}
public void setCreateUserName(String createUserName) {
this.createUserName = createUserName;
}
public String getInfoTitle() {
return infoTitle;
}
public void setInfoTitle(String infoTitle) {
this.infoTitle = infoTitle;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getTenantId() {
return tenantId;
}
public void setTenantId(String tenantId) {
this.tenantId = tenantId;
}
}
InfomationType infomationiType =new InfomationType();
XgMessageInfo xgMessageInfo=new XgMessageInfo();
infomationiType.setXgMessageInfo(xgMessageInfo);
infomationiType.setTypeName("留言信息");
try {
InfomationType infomationiTypeClone=(InfomationType)infomationiType.clone();
Log.d("infoTypeClone",infomationiType.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.toString());
Log.d("infoTypeClone",infomationiType.typeName.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.typeName.toString());
Log.d("infoTypeClone",infomationiType.xgMessageInfo.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.xgMessageInfo.toString());
结果:
**********.InfomationType@41b17010
**********.InfomationType@41b17298
留言信息
clone=留言信息
**********.XgMessageInfo@41b17230
**********.XgMessageInfo@41b17230
infomationiTypeClone.setTypeName("资讯信息");
infomationiTypeClone.getXgMessageInfo().setInfoTitle("某某同学....你有一条留言信息");
Log.d("infoTypeClone",infomationiType.typeName.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.typeName.toString());
Log.d("infoTypeClone",infomationiType.getXgMessageInfo().getInfoTitle());
Log.d("infoTypeClone","clone="+infomationiTypeClone.getXgMessageInfo().getInfoTitle());
结果:
留言信息
clone=资讯信息
某某同学....你有一条留言信息
clone=某某同学....你有一条留言信息
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
深克隆:
将原型的所有属性的值复制到新对象,新对象基本数据类型的字段值的改变不会影响到被复制对象,引用类型复制的不是指向堆的引用地址,而是引用的对象,所以原型和深克隆的对象的引用类型指向的是堆上不同的对象。所以克隆对象的引用类型的改变不会影响到与原型的引用类型。
操作:将InfomationType的克隆方法里添加 infomationType.xgMessageInfo=(XgMessageInfo)xgMessageInfo.clone();这句代码
@Override
public Object clone() throws CloneNotSupportedException {
InfomationType infomationType=null;
try{
infomationType=(InfomationType)super.clone();
infomationType.xgMessageInfo=(XgMessageInfo)xgMessageInfo.clone();
return infomationType;
}catch (Exception e){
}
return null;
}
}
InfomationType infomationiType =new InfomationType();
XgMessageInfo xgMessageInfo=new XgMessageInfo();
infomationiType.setXgMessageInfo(xgMessageInfo);
infomationiType.setTypeName("留言信息");
try {
InfomationType infomationiTypeClone=(InfomationType)infomationiType.clone();
//Log.d("xgMessageInfoClone",xgMessageInfo.getInfoTitle());
// Log.d("xgMessageInfoClone","clone="+xgMessageInfoClone.getInfoTitle());
Log.d("infoTypeClone",infomationiType.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.toString());
Log.d("infoTypeClone",infomationiType.typeName.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.typeName.toString());
Log.d("infoTypeClone",infomationiType.xgMessageInfo.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.xgMessageInfo.toString());
结果:
**********.InfomationType@18f05097 **********.InfomationType@2aa8284
留言信息
clone=留言信息
**********.XgMessageInfo@c75fa6d //不同的对象
**********.XgMessageInfo@1dd706a2
infomationiTypeClone.setTypeName("资讯信息");
infomationiTypeClone.getXgMessageInfo().setInfoTitle("某某同学....你有一条留言信息");
Log.d("infoTypeClone",infomationiType.typeName.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.typeName.toString());
Log.d("infoTypeClone",infomationiType.getXgMessageInfo().getInfoTitle()+",");
Log.d("infoTypeClone","clone="+infomationiTypeClone.getXgMessageInfo().getInfoTitle()+",");
// Log.d("xgMessageInfoClone",xgMessageInfo.getInfoTitle());
// Log.d("xgMessageInfoClone","clone="+xgMessageInfoClone.getInfoTitle());
结果:
留言信息
clone=资讯信息
null, //克隆对象的引用属性的改变不会影响到原型的对象的引用属性
clone=某某同学....你有一条留言信息,
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
利用serializable实现深克隆
类要实现Serializable接口 public class InfomationType implements Cloneable,Serializable,要不然会报java.io.NotSerializableException: matcheng.app.pad.datebean.InfomationType错误。
在InfomationType类里添加深克隆方法
public Object DeepClone(){
try {
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
Object o=ois.readObject();;
return o;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
InfomationType infomationiType =new InfomationType();
XgMessageInfo xgMessageInfo=new XgMessageInfo();
infomationiType.setXgMessageInfo(xgMessageInfo);
infomationiType.setTypeName("留言信息");
try {
// InfomationType infomationiTypeClone=(InfomationType)infomationiType.clone();
//利用Serializable实现深克隆
InfomationType infomationiTypeClone=(InfomationType)infomationiType.DeepClone();
//Log.d("xgMessageInfoClone",xgMessageInfo.getInfoTitle());
// Log.d("xgMessageInfoClone","clone="+xgMessageInfoClone.getInfoTitle());
Log.d("infoTypeClone",infomationiType.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.toString());
Log.d("infoTypeClone",infomationiType.typeName.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.typeName.toString());
Log.d("infoTypeClone",infomationiType.xgMessageInfo.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.xgMessageInfo.toString());
结果:
**********.InfomationType@2aa8284 **********.InfomationType@3282784e
留言信息
clone=留言信息
**********.XgMessageInfo@10708d87 //XgMessageInfo类实现serializable接口,能实现深克隆
**********.XgMessageInfo@1c892d6f
infomationiTypeClone.setTypeName("资讯信息");
infomationiTypeClone.getXgMessageInfo().setInfoTitle("某某同学....你有一条留言信息");
Log.d("infoTypeClone",infomationiType.typeName.toString());
Log.d("infoTypeClone","clone="+infomationiTypeClone.typeName.toString());
Log.d("infoTypeClone",infomationiType.getXgMessageInfo().getInfoTitle()+",");
Log.d("infoTypeClone","clone="+infomationiTypeClone.getXgMessageInfo().getInfoTitle()+",");
// Log.d("xgMessageInfoClone",xgMessageInfo.getInfoTitle());
// Log.d("xgMessageInfoClone","clone="+xgMessageInfoClone.getInfoTitle());
结果:
留言信息
clone=资讯信息
null, //克隆对象的引用属性的改变不会影响到原型的对象的引用属性
clone=某某同学....你有一条留言信息,
} catch (Exception e) {
e.printStackTrace();
}
}