1.浅克隆
- 被克隆的对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。换而言之,浅克隆只是考虑的是被克隆的对象,而不是复制他所引用的对象。
2.深克隆
- 被克隆的对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用,将指向被复制过的新对象。换而言之,深克隆深克隆把当前被复制的对象,以及对其他对象的引用都复制了一遍。
3.克隆的时候需要注意的事项
- 如果采用普通的克隆方法,则要求所有被克隆的对象都要实现 Cloneable 接口。
- 如果是采用IO的方式进行克隆,则当前所有需要被克隆的对象,都要实现serializeable接口。
4.克隆的代码实现
- 浅克隆
直接调用当前对象的 clone() 方法就可以实现。
- 深克隆
方法一:多次调用clone()方法。
方法二:采用IO的形式,完成深克隆。
@Override public Person clone() throws CloneNotSupportedException { //采用IO的方式克隆对象 try { //第一步:创建ByteArrayOutputStream,将数据可以转换成字节。 ByteArrayOutputStream bout = new ByteArrayOutputStream(); //第二步:创建ObjectOutputStream,关联ByteArrayOutPutStream ObjectOutputStream out = new ObjectOutputStream(bout); //第三步:使用ObjectOutputStream的writeObject,读取要复制的对象 out.writeObject(this); //第四步:使用ByteArrayInputStream读取ByteArrayOutputStream的转换的对象字节数据 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); //第五步:创建ObjectInputStream读取对象字节数据,创建新对象 ObjectInputStream in = new ObjectInputStream(bin); //第六步:获取对象 Person clone = (Person) in.readObject(); return clone; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } }