java Object 類中clone方法用法記錄

                             java Object 類中clone方法用法記錄

 

一、clone方法使用步驟

1、在當前類中實現接口: java.lang.Cloneable

2、重寫 clone方法,將訪問修飾符由 protected 調整 public

二、淺克隆

1、 淺克隆: 當前對象中 引用類型 和 克隆後的對象中引用類型 數據共享,容易引起變量污染。

2、 定義一個類 ShadowClone,裏面有基本數據類型和引用數據類型。

/**
* description: shadow 淺克隆
* @version v1.0
* @author w
* @date 2018年7月18日上午10:40:07
*/
public class ShadowClone implements Cloneable{

    private int age ;

    private int[] ages ;

    /**
    * 重寫父類的 clone 方法
    * @throws CloneNotSupportedException
    */
    @Override
    protected ShadowClone clone() throws CloneNotSupportedException {
        return (ShadowClone)super.clone();
    }

    @Override
    public String toString() {
        return "ShadowClone [age=" + age + ", ages=" + Arrays.toString(ages) + "]";
    }

    // 省略 getter , setter 方法
}

3、 定義 ShadowTest 針對 ShadowClone 類的測試

/**
* description: 針對 淺 clone 的測試
* @version v1.0
* @author w
* @date 2018年7月18日上午10:41:56
*/
public class ShadowTest {

    public static void main(String[] args) throws Exception{
        ShadowClone s1 =new ShadowClone();
        s1.setAge(111);
        s1.setAges(new int[]{1,2,3});
        System.out.println("克隆前:"+s1);
       
        ShadowClone s2 = s1.clone();
        System.out.println("克隆後:"+s2);
        System.out.println(s1 == s2); // false ---> 地址值不一致,說明克隆後的對象和克隆前的對象不是同一個對象。
        System.out.println(s1.getAge() == s2.getAge()); // true
        System.out.println(s1.getAges() == s2.getAges()); // true ---> 數組引用類型,地址值一致,說明共享了。
    }

}

三、 深克隆

1、深克隆:和淺克隆相對,當前對象中引用類型和克隆後對象中引用類型 數據不共享,從而可以避免變量污染。

2、 定義一個類 DeepClone,重寫clone方法,對引用類型數據也進行克隆。

/**
* description: 深度clone, 類中引用類型都需要進行深度clone
* @version v1.0
* @author w
* @date 2018年7月18日上午11:02:46
*/

public class DeepClone implements Cloneable{

    private String name ;

    private int age ;

    private int[] ages;

    /**
    * 重寫clone方法,對當前類中引用類型數據也進行克隆
    */
    @Override
    public DeepClone clone() throws CloneNotSupportedException {
        DeepClone deep =(DeepClone)super.clone();
        deep.ages=Arrays.copyOf(ages, ages.length);
        deep.name=new String(name);
        return deep;
    }

    @Override
    public String toString() {
        return "DeepClone [name=" + name + ", age=" + age + ", ages=" + Arrays.toString(ages) + "]";
    }

    // 省略 getter , setter 方法
}

 

3、定義 DeepTest 針對 DeepClone 類的測試

/**
* description: 針對深度clone 的測試
* @version v1.0
* @author w
* @date 2018年7月18日上午11:06:03
*/
public class DeepTest {

    public static void main(String[] args) throws Exception{
        DeepClone d = new DeepClone();
        d.setAge(111);
        d.setAges(new int []{111,222,333});
        d.setName("淘寶");
        System.out.println(d);

        DeepClone d2 = d.clone();
        System.out.println(d2);
        System.out.println(d == d2); // false
        System.out.println(d.getAges() == d2.getAges()); // false
        System.out.println(d.getName() == d2.getName()); // false
    }
}

 

四、總結

1、clone方法,用於對象的拷貝,使用前提是:

  • 當前類必須實現 java.lang.Cloneable接口,

  • 重寫 clone 方法

2、不使用 new 關鍵字創建對象, clone 方法算是一種 。

3、clone 默認的是淺拷貝,要想實現深度拷貝,必須手動對需要拷貝對象中的引用類型數據手動逐一拷貝。

 

 

五、參考資料

1、 這裏只是簡單的介紹了下 clone 方法的使用,要了解更多請參考以下大佬的博文:

 

PS: 2018年7月18日 13:46:15  csdn zz的產品,改了富文本編輯器,反人類無法使用!!  文章格式慘不忍睹, 不想整格式了,需要源碼or原帶格式的文章,請私信!! 

  強烈鄙視csdn 不顧用戶感受,一刀切的做法,。。 再次鄙視,,謝謝!

 

PS2: 2018年7月26日 11:17:26  今天 靜下心來,新版的文本編輯器還可以用~  只是原來沒有適應而已~ 作爲一個coder,必須要學會適應一切新生事務呀~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章