【Java】对Object.clone的理解

2021-06-18  本文已影响0人  littlefogcat

Object.clone的理解

通过实现Cloneable接口和重写clone方法可以实现拷贝对象。

这里clone方法实现的是浅拷贝,即字段只是复制相应的引用。如下示例中所示,对象a进行克隆之后得到一个新对象aClone,而a.baClone.b其实是同一个对象。

class CloneTest {

    static class A implements Cloneable {
        B b = new B();

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

        @Override
        public String toString() {
            return b.name;
        }
    }

    static class B {
        String name = "bob";
    }

    public static void main(String[] args) throws Exception {
        A a = new A();
        A aClone = (A) a.clone();
        System.out.println(a);
        System.out.println(aClone);
        a.b.name = "alice";
        System.out.println(a);
        System.out.println(aClone);
    }

输出:

bob
bob
alice
alice

如何实现深拷贝?

1. 序列化

通过实现Serializable接口或者通过json将对象序列化,再反序列化为对象。
这么做的缺点在于,就是如果通过Serializable进行序列化,那么类的所有成员都必须实现Serializable接口才行;如果通过json序列化,那么会面临循环引用的问题。

2. 反射

通过反射可以获取对象的所有字段并进行递归克隆。这种方式的难点在于如何处理不包含无参构造方法的类对象。

3. 其他方式

目前看到的其他方式,诸如覆写clone方法等,均无实操意义,不提。

上一篇 下一篇

猜你喜欢

热点阅读