美文网首页
Java 深拷贝和浅拷贝

Java 深拷贝和浅拷贝

作者: tdwmarlboro | 来源:发表于2018-05-25 14:51 被阅读0次

    浅拷贝:

    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。

    换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

    深拷贝:

    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。

    那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。

    换言之,深拷贝把要复制的对象所引用的对象都要复制一遍。

    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接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从流里读出来,便可以重建对象。

    相关文章

      网友评论

          本文标题:Java 深拷贝和浅拷贝

          本文链接:https://www.haomeiwen.com/subject/texrfftx.html