引用拷贝
二者的引用是同一个对象,并没有创建出一个新的对象
因为是同一个对象的引用,所以两者改一个,另一个对象的值也随之改变
浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝
如果属性是基本类型,拷贝的就是基本类型的值;
如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
深拷贝
被拷贝对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
@Override protected Object clone() throws CloneNotSupportedException { Person newPerson = (Person)super.clone(); newPerson.address = (Address) newPerson.address.clone(); return newPerson; }
通过对象序列化实现深拷贝
将对象序列化为字节序列后,默认会将该对象的整个对象图进行序列化,再通过反序列即可完美地实现深拷贝。
public class Person implements Serializable, Cloneable{ public Object deepClone() { try { ByteArrayOutputStream bo= new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bo); os.writeObject(this); ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi=new ObjectInputStream(bi); return(oi.readObject()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }}