1. 程式人生 > >關於 Cloneable 介面 和 重寫 Object.clone() 方法的嘗試順便複習深拷貝和淺拷貝

關於 Cloneable 介面 和 重寫 Object.clone() 方法的嘗試順便複習深拷貝和淺拷貝

一個類如果想重寫 Object 的 clone 方法,則必須實現 Cloneable 介面,否則呼叫 clone 方法時將會丟擲 CloneNotSupportException 異常

/**
 * Author:  heatdeath
 * Date:    2018/7/7
 * Desc:
 */
public class CloneDemo {
    static class CloneClass {
        public String str;

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return
super.clone(); } } public static void main(String[] args) throws Exception { CloneClass cloneClass1 = new CloneClass(); System.out.println(cloneClass1); cloneClass1.str = "hello world"; CloneClass cloneClass2 = (CloneClass) cloneClass1.clone(); System.out.println(cloneClass2); System.out.println(cloneClass2.str); } }
com.heatdeath.test_package.CloneDemo$CloneClass@4554617c
Exception in thread "main" java.lang.CloneNotSupportedException: com.heatdeath.test_package.CloneDemo$CloneClass
    at java.lang.Object.clone(Native Method)
    at com.heatdeath.test_package.CloneDemo$CloneClass.clone(CloneDemo.java:14)
    at com
.heatdeath.test_package.CloneDemo.main(CloneDemo.java:23)

正確的方式是,實現 Cloneable 介面,再重寫 clone 方法(通常直接呼叫 super.clone() 方法,即 Object 類中受保護的 native clone 方法即可)

public class CloneDemo {
    static class CloneClass implements Cloneable {
        public String str;

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


    public static void main(String[] args) throws Exception {
        CloneClass cloneClass1 = new CloneClass();
        System.out.println(cloneClass1);
        cloneClass1.str = "hello world";

        CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
        System.out.println(cloneClass2);
        System.out.println(cloneClass2.str);
    }
}
com.heatdeath.test_package.CloneDemo$CloneClass@4554617c
com.heatdeath.test_package.CloneDemo$CloneClass@74a14482
hello world

Process finished with exit code 0

再捎帶著複習一下淺拷貝和深拷貝好了

淺拷貝 demo

public class CloneDemo {
    static class CloneClass implements Cloneable {
        public String str;
        public Hello helloRef;

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

    static class Hello {
    }

    public static void main(String[] args) throws Exception {
        CloneClass cloneClass1 = new CloneClass();
        System.out.println(cloneClass1);
        cloneClass1.str = "hello world";
        cloneClass1.helloRef = new Hello();
        System.out.println(cloneClass1.helloRef);

        CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
        System.out.println(cloneClass2);
        System.out.println(cloneClass2.str);
        System.out.println(cloneClass2.helloRef);
    }
}

這裡寫圖片描述

深拷貝

public class CloneDemo {
    static class CloneClass implements Cloneable {
        public String str;
        public Hello helloRef;

        @Override
        protected Object clone() throws CloneNotSupportedException {
            Object obj = super.clone();
            ((CloneClass) obj).helloRef = (Hello) helloRef.clone();
            return obj;
        }
    }

    static class Hello implements Cloneable {
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }

    public static void main(String[] args) throws Exception {
        CloneClass cloneClass1 = new CloneClass();
        System.out.println(cloneClass1);
        cloneClass1.str = "hello world";
        cloneClass1.helloRef = new Hello();
        System.out.println(cloneClass1.helloRef);

        CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
        System.out.println(cloneClass2);
        System.out.println(cloneClass2.str);
        System.out.println(cloneClass2.helloRef);
    }
}

這裡寫圖片描述