java 克隆 对象
1.利用序列化和反序列化进行对象的深拷贝
不用实现clone,实现深度拷贝
package com.sinaif.model.admin;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.sinaif.model.enums.ArbitCaseStatusEnum;
public class BaseBean implements Serializable{
/**
* 利用序列化和反序列化进行对象的深拷贝
* @return
* @throws Exception
*/
public Object deepClone() throws Exception{
//序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
//
oos.writeObject(this);
//反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
// public static void main(String[] args) {
// ArbitCaseBean case1 = new ArbitCaseBean();
// case1.setId("11111");
// case1.setCaptypeid("33343");
//
// try {
// ArbitCaseBean case2 = (ArbitCaseBean) case1.deepClone();
// case2.setId("22222");
// System.out.println(case1.toString());
// System.out.println(case2.toString());
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
}
2.问题 :实现clone,为什么一定要implement Cloneable 接口
解答:
类 Object 的 clone() 方法首先会检查 this.getClass() 是否实现了 Cloneable 接口。Cloneable 只是一个标志接口而已,
用标志该类是否有克隆功能。如果 this.getClass() 没有实现 Cloneable 接口, clone() 就会抛CloneNotSupportedException 返回。
参考:https://www.cnblogs.com/gw811/archive/2012/10/07/2712252.html
针java.lang.Object.clone()分析
实现clone需要注意:
- 在类的声明中加入“ implements Cloneable ”,标志该类有克隆功能;
- Override 类 Object 的 clone() 方法,在该方法中调用 super.clone() ,修改protected 为 public ,提升可见性: