深克隆与浅克隆
详见代码:
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* clone的要求 实现CloneAble接口 修改clone方法为public,然后覆写clone方法
* 分类:深克隆与浅克隆
* 浅克隆:实现对对象中的 基本数据类型与引用类型地址的复制
* 效果:基本数据类型全复制 引用数据类型 对引用对象地址进行复制 当clone对象修改后,如果修改了引用类型,则会修改到原本的对象,
* 这样的做法没有达到完全复制,相互之间没有影响的目的。
* 深克隆:不仅拷贝基础数据类型,同时拷贝了引用类型
* 实现则是在引用类型所在的类实现CloneAble接口,并使用public访问修饰符重写clone()方法
* @author xionglijing
* @date 2020/9/14 14:06
*/
public class CloneTest{
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("ShannXi","ShangLuo");
CopySource source = new CopySource(1,"xiaoming",23,address);
CopySource testSource = source.clone();
testSource.getAddress().setCity("ShangNan");
testSource.setId(22);
testSource.setAge(55);
System.out.println(source);
System.out.println(testSource);
}
}
@Data
@AllArgsConstructor
class CopySource implements Cloneable{
private int id;
private String name;
private Integer age;
private Address address;
@Override
public CopySource clone() throws CloneNotSupportedException {
CopySource copySource = (CopySource)super.clone();
copySource.address = address.clone();
return copySource;
}
}
@Data
@AllArgsConstructor
class Address implements Cloneable{
private String provence;
private String city;
/**
* 浅克隆将下面的方法以及类上的删除即可
* @return
* @throws CloneNotSupportedException
*/
@Override
public Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
}
}
执行结果:
深克隆:
CopySource(id=1, name=xiaoming, age=23, address=Address(provence=ShannXi, city=ShangLuo))
CopySource(id=22, name=xiaoming, age=55, address=Address(provence=ShannXi, city=ShangNan))
浅克隆:
CopySource(id=1, name=xiaoming, age=23, address=Address(provence=ShannXi, city=ShangNan))
CopySource(id=22, name=xiaoming, age=55, address=Address(provence=ShannXi, city=ShangNan))