/**定義使用者**/
public class User {
private String name;
private Address address;
// constructors, getters and setters
}
/**地址**/
public class Address {
private String city;
private String country;
過載clone()方法
Object父類有個clone()的複製方法,不過它是protected型別的,
我們需要重寫它並修改為public型別。
除此之外,子類還需要實現Cloneable介面來告訴JVM這個類是可以複製的。
重寫程式碼
讓我們修改一下User類,Address類,實現Cloneable介面,使其支援深複製。
/**
* 地址
*/
public class Address implements Cloneable {
@Override
public Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
* 使用者
public class User implements Cloneable {
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方法賦值的物件跟原來的物件時同時獨立存在的。
/**定義使用者**/
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方法賦值的物件跟原來的物件時同時獨立存在的。