今天做原型模式的作业搞了半天,其中涉及的就是深复制和浅复制。首先我们应该知道java虚拟机是如何分配空间的。有两块空间,分别为栈内存和堆内存。通常,声明一个变量是在栈内存中分配空间,而创建一个对象是在堆内存中分配空间。
一、浅复制
- 通过调用父类的clone()
//浅复制函数
public Object clone(){
Hsf0401ConcreteDataChart copy=null;
try {
copy=(Hsf0401ConcreteDataChart) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return copy;
}
public static void main(String[] args) throws ClassNotFoundException, IOException {
Hsf0401ConcreteDataChart dataChart,copy;
dataChart=new Hsf0401ConcreteDataChart();
Hsf0401Dataset dataset = new Hsf0401Dataset();
dataset.setId("1");
dataset.setColor("red");
dataset.setData("1234");
dataChart.setDataset(dataset);
System.out.println("dataChart1="+dataChart.getDataset());
copy=(Hsf0401ConcreteDataChart) dataChart.clone();
System.out.println("复制后的结果="+copy.getDataset());
//修改复制后的值
copy.getDataset().setColor("green");
copy.getDataset().setId("2");
Object modify = copy.modify(copy);
System.out.println("dataChart2="+dataChart.getDataset());
System.out.println("修改后的结果="+modify);
}
二、深复制
- 通过序列化实现
//深复制函数
public Object deepclone() throws IOException, ClassNotFoundException{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);//从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
public static void main(String[] args) throws ClassNotFoundException, IOException {
Hsf0401ConcreteDataChart dataChart,copy;
dataChart=new Hsf0401ConcreteDataChart();
Hsf0401Dataset dataset = new Hsf0401Dataset();
dataset.setId("1");
dataset.setColor("red");
dataset.setData("1234");
dataChart.setDataset(dataset);
System.out.println("dataChart1="+dataChart.getDataset());
copy=(Hsf0401ConcreteDataChart) dataChart.deepclone();
System.out.println("复制后的结果="+copy.getDataset());
//修改复制后的值
copy.getDataset().setColor("green");
copy.getDataset().setId("2");
Object modify = copy.modify(copy);
System.out.println("dataChart2="+dataChart.getDataset());
System.out.println("修改后的结果="+modify);
}