java中的三種拷貝方式
第一種 基本數據類型:
八大基本數據類型:
int apples = 5;
int pears = apples;
第二種 對象 淺拷貝:
Student stu1 = new Student();
stu1.setNumber(12345);
Student stu2 = stu1;
System.out.println("學生1:" + stu1.getNumber());
System.out.println("學生2:" + stu2.getNumber());
但是如果:
stu2.setNumber(54321);
System.out.println("學生1:" + stu1.getNumber());
System.out.println("學生2:" + stu2.getNumber());
因爲 stu1 和 stu2 指向內存堆中同一個對象
解決方法:
被複制的類需要實現Clonenable接口
覆蓋clone()方法,訪問修飾符設爲public。方法中調用super.clone()方法得到需要的複製對象,(native爲本地方法)
@Override
public Object clone() {
Student stu = null;
try{
stu = (Student)super.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return stu;
}
Student stu1 = new Student();
stu1.setNumber(12345);
Student stu2 = (Student)stu1.clone();
System.out.println("學生1:" + stu1.getNumber());
System.out.println("學生2:" + stu2.getNumber());
stu2.setNumber(54321);
System.out.println("學生1:" + stu1.getNumber());
System.out.println("學生2:" + stu2.getNumber());
但是又如果:
Address addr = new Address();
addr.setAdd("杭州市");
Student stu1 = new Student();
stu1.setNumber(123);
stu1.setAddr(addr);
Student stu2 = (Student)stu1.clone();
System.out.println("學生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());
System.out.println("學生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());
addr.setAdd("西湖區");
System.out.println("學生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());
System.out.println("學生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());
原因是淺複製只是複製了addr變量的引用,將值複製後再將引用返回給新對象,並沒有真正的開闢另一塊空間。
淺拷貝:BeanUtils.copyProperties(executiveSummary, executiveSummaryOld);
第二種 對象 深拷貝:
將Address類可複製化
然後在student類中:
@Override
public Object clone() {
Student stu = null;
try{
stu = (Student)super.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
stu.addr = (Address)addr.clone();
return stu;
}
或者序列化實現