浅拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。
换言之,深拷贝把要复制的对象所引用的对象都要复制一遍。
1)序列化
2)内部创建新对象构造就可以了
3)采用cloneabel接口进行深拷贝
实现Cloneable接口(但是要将所有对象中的引用对象都实现Cloneable接口,并且在对象的clone方法中调用,就是层层克隆的作用,保证所有数据都被克隆)
Java中对象的克隆
1、为了获取对象的一份拷贝,可以利用Object类的clone()方法。
2、在派生类中覆盖基类的clone()方法,并声明为public。(Object类中的clone()方法是Protected的)。在子类重写的时候,可以扩大访问修饰符的范围。
3、在派生类的clone()方法中,调用super.clone()。因为在运行时刻,Object类中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。
4、在派生类中实现Cloneable接口。
Java 的clone() 方法
clone()方法定义在Object类中。
clone()方法将对象复制了一份并返回给调用者。拷贝具体的含义将取决于对象所在的类。
一般而言,clone()方法满足:
1、克隆对象与原对象不是同一个对象。即对任何的对象x:
x.clone()!=x
2、克隆对象与原对象的类型一样。即对任何的对象x:
x.clone().getClass() == x.getClass()
3、如果对象x的equals()方法定义恰当,那么下式应该成立:
x.clone().equals(x)
利用序列化实现深拷贝
把对象写到流里的过程是序列化过程(Serialization),而把对象从流中读出来的过程则叫做反序列化过程(Deserialization)。
在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从流里读出来,便可以重建对象。
网友评论