说实话,没太看懂...先写一部分
深复制与浅复制的区别:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ShallowDeep implements Cloneable, Serializable
{
DeepObject dot = new DeepObject();
public Object deepCopy() throws Exception
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (ois.readObject());
}
public Object shallowCopy() throws Exception
{
ShallowDeep sd = (ShallowDeep)super.clone();
return sd;
}
public static void main(String[] args)
{
ShallowDeep sd = new ShallowDeep();
try
{
ShallowDeep sd2 = (ShallowDeep)sd.deepCopy();
ShallowDeep sd3 = (ShallowDeep)sd.shallowCopy();
sd.dot.i = 100;
System.out.println(sd2.dot.i);
System.out.println(sd3.dot.i);
}catch(Exception e)
{
e.printStackTrace();
}
}
}
class DeepObject implements Serializable
{
int i = 0;
}
deepCopy是深复制,采用的是先序列化(Serialize)到流(Stream)中,再读出来的方法。它需要类及其持有的类均实现Serializable接口。
shallowCopy是浅复制,采用的是Cloneable接口中默认的clone方法。浅复制在复制了一个类时对于该类所持有的可以成为引用的内容,只是复制了其引用,即sd与sd3中的dot实际上指向同一个dot对象。
实现深复制也可以通过其他方法完成,但需要谨慎考虑并仔细实现复制多少层的问题(如本例中,假如DeepObject类中仍嵌套有多层对象)。另外需要注意可能出现的循环引用问题。