美文网首页
Java 中的深拷贝与浅拷贝

Java 中的深拷贝与浅拷贝

作者: xsza | 来源:发表于2018-09-27 16:23 被阅读0次

    一、浅拷贝

    浅拷贝指的是按位复制对象属性,对于引用类型属性复制引用,对于基本类型属性则复制数据。

    我们通过下面的例子来看一下浅拷贝做的操作:

    浅拷贝

    当通过拷贝p1生成对象p2的后,我们发现两者的地址变换了,也就是说堆中分配的区域是不同,这个时候可以看出来两个确实不是同一个对象了。同时我们可以发现两个对象对于hand对象的引用是相同。

    可以预想的是,当我们改变hand对象中fingerNum的值的时候,两个Person对象都会受到影响,因为在Java中有两种传递,一种是引用传递,一种是值传递,此处表现的就是引用传递。

    二、深拷贝

    与浅拷贝相对,对于引用类型属性会新建引用,对于基本类型属性会复制数据

    我们仅通过修改Person对象的构造器即可以让其从浅拷贝变为深拷贝,从原来的直接传递引用变为创建对象并赋值,

    深拷贝

    从上图我们可以看到两个person对象的地址不同,对应的hand对象的地址也不同。

    三、Cloneable接口

    Cloneable接口位于lang包下,这是一个空接口,实现该接口仅作为一个标记,表示对象可以调用从Object对象继承而来的clone方法,否则会抛出CloneNotSupportedException异常。

    实现了Cloneable接口的对象可以通过调用clone方法来复制一个自己,这里的clone方法其实是进行了浅拷贝操作,我们可以通过实验来看一看:

    浅拷贝

    该试验中有两个类,一个是Man,另一个是HandMan包含了Hand,同时Man实现了Cloneable接口并且重写了clone方法。当我们通过调用clone方法生成另一个实例对象之后,我们发现两个实例对象的地址不同,但是两个对象中包含的hand地址是相同的,这符合上述所说的浅拷贝。

    如果我们想通过clone实现深拷贝呢?

    其实道理是相通的,我们只要在clone Man对象的时候,把Hand对象也clone一下,这样就会由浅拷贝变为深拷贝,当然前提是Hand对象也实现Cloneable接口

    深拷贝

    四、总结

    1.浅拷贝出来的对象是相互影响的,深拷贝出来的对象是独立的

    2.Object对象中的clone方法进行的是浅拷贝

    相关文章

      网友评论

          本文标题:Java 中的深拷贝与浅拷贝

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