java中的对象克隆
1.简述
克隆;复制一个对象和当前对象一样,用来保存对象的信息。克隆分为深克隆和浅克隆
2.浅克隆
只能克隆基本数据类型的属性,对于引用类型,则只能记住地址不能复制对象。
代码演示
package clones;
/**
* @program: mianshi
* @ClassName User
* @description:
* @author: Mr.Yuan
* @create: 2021-07-20 20:32
**/
public class User implements Cloneable{
//编号
private Integer id;
//姓名
private String name;
//操作人
private User opertor;
public User(Integer id, String name, User opertor) {
this.id = id;
this.name = name;
this.opertor = opertor;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", opertor=" + opertor +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getOpertor() {
return opertor;
}
public void setOpertor(User opertor) {
this.opertor = opertor;
}
}
被克隆的类必须实现cloneable接口并且重写clone方法
克隆测试类
package clones;
/**
* @program: mianshi
* @ClassName test
* @description:
* @author: Mr.Yuan
* @create: 2021-07-20 20:33
**/
public class test {
public static void main(String[] args) throws CloneNotSupportedException {
//创建一个操作者
User user2=new User(1,"管理员",null);
//将操作者赋值给被克隆者
User user=new User(2,"张定元",user2);
//对被克隆者进行克隆
User user1 = (User) user.clone();
//更改操作者信息
user2.setId(3);
//打印克隆者
System.out.println(user1);
}
}
结果
`“D:\Program Files\Java\jdk1.8.0_261\bin\java.exe” "-javaagent:D:\Program Files\Idea\lib\idea_rt.jar=65443:D:\Program
User{id=2, name=‘张定元’, opertor=User{id=3, name=‘管理员’, opertor=null}}
Process finished with exit code 0`
更改了操作者这个对象的信息后发现
被克隆者也更改了,故浅克隆对于引用类型对象只复制地址
3.深克隆
将对象的所有信息全部克隆不论基本类型、引用类型
方法;
1.通过序列化将对象序列化再序列化回来
2.通过FastJson把对象转换为json字符串,再把json字符串转化为java对象