使用clone类实现对java对象的浅克隆-------->深克隆(深拷贝)
浅克隆不能实现对象的克隆,克隆前后的引用变量还是一同指向堆上的同一对象即伪克隆,深拷贝可解决这一问题
example:
package com.homework.classtest2;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
ThirdLevel thirdLevel = new ThirdLevel(1, 2.0);
TwoLevel twoLevel = new TwoLevel(3, 4.0, thirdLevel);
OneLevel oneLevel = new OneLevel(5, 6.0, twoLevel);
OneLevel oneLevel1Clone = (OneLevel) oneLevel.clone();
//复制前
System.out.println(oneLevel);
System.out.println(oneLevel1Clone);
//修改复制版本的value值
System.out.println("--------------------------------------------------------------------------------------");
oneLevel1Clone.oneLevelIntValue = 10;
oneLevel1Clone.twoLevel.twoLevelIntValue = 20;
oneLevel1Clone.twoLevel.thirdLevel.thirdLevelIntValue = 30;
System.out.println(oneLevel);
System.out.println(oneLevel1Clone);
}
}
class OneLevel implements Cloneable {
int oneLevelIntValue;
Double oneLevelDoubleValue;
TwoLevel twoLevel;
@Override
protected Object clone() throws CloneNotSupportedException {
OneLevel oneLevelClone = (OneLevel) super.clone();
TwoLevel twoLevelClone = (TwoLevel) twoLevel.clone();
oneLevelClone.twoLevel = twoLevelClone;
return oneLevelClone;
}
@Override
public String toString() {
return "OneLevel{" +
"OneLevelIntValue=" + oneLevelIntValue +
", OneLevelDoubleValue=" + oneLevelDoubleValue +
", twoLevel=" + twoLevel +
'}';
}
public OneLevel(int oneLevelIntValue, Double oneLevelDoubleValue, TwoLevel twoLevel) {
this.oneLevelIntValue = oneLevelIntValue;
this.oneLevelDoubleValue = oneLevelDoubleValue;
this.twoLevel = twoLevel;
}
}
class TwoLevel implements Cloneable {
int twoLevelIntValue;
Double twoLevelDoubleValue;
ThirdLevel thirdLevel;
@Override
protected Object clone() throws CloneNotSupportedException {
TwoLevel twoLevelClone = (TwoLevel) super.clone();
ThirdLevel thirdLevelClone = (ThirdLevel) thirdLevel.clone();
twoLevelClone.thirdLevel = thirdLevelClone;
return twoLevelClone;
}
@Override
public String toString() {
return "TwoLevel{" +
"TwoLevelIntValue=" + twoLevelIntValue +
", TwoLevelDoubleValue=" + twoLevelDoubleValue +
", thirdLevel=" + thirdLevel +
'}';
}
public TwoLevel(int twoLevelIntValue, Double twoLevelDoubleValue, ThirdLevel thirdLevel) {
this.twoLevelIntValue = twoLevelIntValue;
this.twoLevelDoubleValue = twoLevelDoubleValue;
this.thirdLevel = thirdLevel;
}
}
class ThirdLevel implements Cloneable {
int thirdLevelIntValue;
Double thirdLevelDoubleValue;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "ThirdLevel{" +
"ThirdLevelIntValue=" + thirdLevelIntValue +
", TwoLevelDoubleValue=" + thirdLevelDoubleValue +
'}';
}
public ThirdLevel(int thirdLevelIntValue, Double twoLevelDoubleValue) {
this.thirdLevelIntValue = thirdLevelIntValue;
this.thirdLevelDoubleValue = twoLevelDoubleValue;
}
}