角色
Obj obj=new Obj(); //创建一个新的对象
obj.setName(this.name); //设置其中变量的值
obj.setAge(this.age);
浅克隆
周报
/*
* 附件类,这个是周报的附件
*/
public class Attachment {
private String name; // 名称
public Attachment(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/*
* 这个是周报类,这个类是实现接口Prototype这个接口的
*/
public class WeeklyLog implements Cloneable {
private String name; // 姓名
private String date; // 日期
private String content; // 内容
private Attachment attachment; //附件,是一个引用对象,这个只能实现浅克隆
public WeeklyLog() {
super();
}
/**
* 构造方法
*/
public WeeklyLog(String name, String date, String content) {
super();
this.name = name;
this.date = date;
this.content = content;
}
/**
* 提供一个clone方法,返回的是一个clone对象
*/
public WeeklyLog clone() {
Object object = null; // 创建一个Object对象
try {
object = super.clone(); // 直接调用clone方法,复制对象
return (WeeklyLog) object; // 返回即可
} catch (CloneNotSupportedException e) {
System.out.println("这个对象不能复制.....");
return null;
}
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
WeeklyLog p1 = new WeeklyLog("陈加兵", "第一周", "获得劳动模范的称号..."); // 创建一个对象
Attachment attachment = new Attachment("消息");
p1.setAttachment(attachment); // 添加附件
WeeklyLog p2 = p1.clone();
System.out.println(p1 == p2); // 判断是否正确
p2.setName("Jack"); // 修改P2对象的内容
p2.setDate("第二周");
p2.setContent("工作认真.....");
System.out.println(p2.getName());
// 返回true,可以知道这两个附件的地址是一样的
System.out.println(p1.getAttachment() == p2.getAttachment());
}
}
深度克隆
/*
* 附件类,这个是周报的附件
*/
public class Attachment implements Serializable{
private static final long serialVersionUID = -799959163401886355L;
private String name; // 名称
public Attachment(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/*
* 这个是周报类,这个类是实现接口Prototype这个接口的
*/
public class WeeklyLog implements Serializable {
private static final long serialVersionUID = -8782492113927035907L;
private String name; // 姓名
private String date; // 日期
private String content; // 内容
private Attachment attachment; // 附件,是一个引用对象,这个只能实现浅克隆
public WeeklyLog() {
super();
}
/**
* 构造方法
*/
public WeeklyLog(String name, String date, String content) {
super();
this.name = name;
this.date = date;
this.content = content;
}
/**
* 提供一个clone方法,返回的是一个clone对象
*/
public WeeklyLog clone() {
// 将对象写入到对象流中
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
arrayOutputStream); // 创建对象输出流
objectOutputStream.writeObject(this); // 将这个类的对象写入到输出流中
} catch (IOException e) {
e.printStackTrace();
return null;
}
// 将对象从流中读出
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(
arrayOutputStream.toByteArray());
WeeklyLog weeklyLog;
try {
ObjectInputStream objectInputStream = new ObjectInputStream(
arrayInputStream);// 新建对象输入流
weeklyLog = (WeeklyLog) objectInputStream.readObject(); // 读取对象从流中
return weeklyLog;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
WeeklyLog p1 = new WeeklyLog("陈加兵", "第一周", "获得劳动模范的称号..."); // 创建一个对象
Attachment attachment = new Attachment("消息");
p1.setAttachment(attachment); // 添加附件
WeeklyLog p2 = p1.clone();
System.out.println(p1 == p2); // 判断是否正确
p2.setName("Jack"); // 修改P2对象的内容
p2.setDate("第二周");
p2.setContent("工作认真.....");
System.out.println(p2.getName());
//返回false,可以看出这个是不同的地址,因此完成了深克隆
System.out.println(p1.getAttachment() == p2.getAttachment());
}
}