創建一個對象除了new, 還可以通過調用已有對象的clone()的方式得到
Cloneable只是一個標識接口.
clone()方法的聲明是在Object類中.
MyClass implements Cloneable只是表示這個類會提供clone()方法.
外界可以這樣得到一個新對象, 而不一定非要new一個對象出來.
MyClass myClass1 = myClass.clone();
調用已有對象的clone()方法得到的新對象和new 一個對象出來的區別:
使用clone()不會調用構造方法, 實現本質是內存中的二進制數據的復制.
淺拷貝和深拷貝的區別
區別在, 對引用類型的成員變量的賦值上.
WordDocument implements Clonable {
int index;
ArrayList<String> mImages;
//淺拷貝
@Override
protected WordDocument clone() {
WordDocument doc = (WordDocument)super.clone();
doc.index = this.index;
doc.mImages = this.mImages;
return doc;
}
//深拷貝
@Override
protected WordDocument clone() {
WordDocument doc = (WordDocument)super.clone();
doc.index = this.index;
doc.mImages = (ArrayList<String>)this.mImages.clone();
return doc;
}
}
使用場景
模塊A負責更新用戶信息類 - User, 模塊B要在一個界面上展示User中的數據. 如果直接把User的對象給模塊B使用, 難免模塊B調用一些public方法對User的對象進行了數據修改.
這個情況下, 就可以調用User對象.clone(), 把這個拷貝出來的對象給模塊B使用, 即使模塊B修改了對象中的數據, 也不會影響到原來的對象.
使用這種保護性拷貝的方式, 避免原來的對象被其他模塊修改.
-------DONE.------------