首頁>Club>
8
回覆列表
  • 1 # 隔壁家的吃瓜少年

    /**定義使用者**/

    public class User {

    private String name;

    private Address address;

    // constructors, getters and setters

    }

    /**地址**/

    public class Address {

    private String city;

    private String country;

    // constructors, getters and setters

    }

    過載clone()方法

    Object父類有個clone()的複製方法,不過它是protected型別的,

    我們需要重寫它並修改為public型別。

    除此之外,子類還需要實現Cloneable介面來告訴JVM這個類是可以複製的。

    重寫程式碼

    讓我們修改一下User類,Address類,實現Cloneable介面,使其支援深複製。

    /**

    * 地址

    */

    public class Address implements Cloneable {

    private String city;

    private String country;

    // constructors, getters and setters

    @Override

    public Address clone() throws CloneNotSupportedException {

    return (Address) super.clone();

    }

    }

      

    /**

    * 使用者

    */

    public class User implements Cloneable {

    private String name;

    private Address address;

    // constructors, getters and setters

    @Override

    public User clone() throws CloneNotSupportedException {

    User user = (User) super.clone();

    user.setAddress(this.address.clone());

    return user;

    }

    }

      需要注意的是,super.clone()其實是淺複製,

    所以在重寫User類的clone()方法時,address物件需要呼叫address.clone()重新賦值。

    擴充套件:

    為什麼要克隆?

      大家先思考一個問題,為什麼需要克隆物件?直接new一個物件不行嗎?

      答案是:克隆的物件可能包含一些已經修改過的屬性,而new出來的物件的屬性都還是初始化時候的值,所以當需要一個新的物件來儲存當前物件的“狀態”就靠clone方法了。那麼我把這個物件的臨時屬性一個一個的賦值給我新new的物件不也行嘛?可以是可以,但是一來麻煩不說,二來,大家透過上面的原始碼都發現了clone是一個native方法,就是快啊,在底層實現的。

      提個醒,我們常見的Object a=new Object();Object b;b=a;這種形式的程式碼複製的是引用,即物件在記憶體中的地址,a和b物件仍然指向了同一個物件。

      而透過clone方法賦值的物件跟原來的物件時同時獨立存在的。

  • 中秋節和大豐收的關聯?
  • 養二三百隻雞需要辦理相關手續嗎?