理解 clone 方法

本贴最后更新于 1766 天前,其中的信息可能已经时过境迁

克隆方法

clone 是 Object 的一个方法,但是要支持 clone 方法,需要对象实现 Cloneable 接口,实现了 cloneable 接口后,可以使用 clone 方法。使用 clone 方法可以实现对象的克隆。

克隆的类型——浅克隆(ShallowClone)和深克隆(DeepClone)。

  • 浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
  • 深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

请看下面的例子:

package core;

/**
 * @author 关注微信公众号:Java学习交流社区
 * (更多技术干货、原创文章、面试资料,群聊吹水一应俱全)
 *
 * 测试clone方法
 */
public class CloneDemo {

    public static void main(String[] args) throws CloneNotSupportedException {
        A a = new A();
        B b = new B();
        a.setB(b);
        A cloneA = (A)a.clone();
        a.getB().setS("ss");
        System.out.println(a == cloneA);
        System.out.println(b == cloneA.getB());
        System.out.println(cloneA.getB().getS());
    }

}

class A implements Cloneable{

    private B b;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class B implements Cloneable{

    String s = "s";
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }
}

运行结果:

false
true
ss

可以看出:

  1. 调用 clone 方法返回的 cloneA 与原对象 A 进行==比较,返回的是 false,即两个引用指向不同的对象
  2. 调用 clone 方法返回的 cloneA 中的属性 b 与原对象的 b 进行==比较,返回的是 true,即两个引用指向相同的对象

这种情况就是俗称的浅克隆,如果对象中所有的非基本类型属性都进行 clone,即为深克隆。

常用的浅克隆方法

Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier(推荐使用,实测速度最快)

常用的深克隆方法

实现 Serializable 接口进行序列化和反序列化,各种 Json 格式的序列化和反序列化



扫码关注微信公众号《Java学习交流社区》,即可获取原创《Java并发编程与高并发解决方案》+《Redis》思维导图
作者:Java学习交流社区
地址:https://www.jvscc.cn/articles/2019/08/30/1567158083430.html
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
3 操作
figo2young 在 2019-09-04 14:51:28 更新了该帖
figo2young 在 2019-09-04 14:46:18 更新了该帖
figo2young 在 2019-09-04 14:43:51 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...