美文网首页
【Java】对Object.clone的理解

【Java】对Object.clone的理解

作者: littlefogcat | 来源:发表于2021-06-18 01:07 被阅读0次

    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方法等,均无实操意义,不提。

    相关文章

      网友评论

          本文标题:【Java】对Object.clone的理解

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