hutool提供了兩種用克隆的方式, 但都是淺克隆的
淺克隆
1.實現Cloneable接口
/**
* 貓貓類,使用實現Cloneable方式
* @author Looly
*
*/
private static class Cat implements Cloneable<Cat>{
private String name = "miaomiao";
private int age = 2;
@Override
public Cat clone() {
try {
return (Cat) super.clone();
} catch (CloneNotSupportedException e) {
throw new CloneRuntimeException(e);
}
}
}
2.繼承CloneSupport類
這樣就不用自己去寫clone方法了
/**
* 狗狗類,用於繼承CloneSupport類
* @author Looly
*
*/
private static class Dog extends CloneSupport<Dog>{
private String name = "wangwang";
private int age = 3;
}
深克隆
深克隆hutool是用流來完成的, 就像下面這樣:
ObjectUtil.cloneByStream(obj)
淺克隆: 複製出來的對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。
深克隆: 就是其他對象也實例化了新的對象, 不是指向原對象的;
要注意的是, 拷貝中涉及的所有類都要實現Serializable接口;
比如
public class Cat extends CloneSupport<Cat> implements Serializable {
public int num;
public Person master;
}
如果我想克隆一個Cat對象, 那麼我不僅Cat要實現Serializable, 裏面的對象Person也要實現Serializable, 感謝基於流的克隆, 其實不需要去實現Person的clone方法;