Java中的对象复制大概有以下几种
- 直接赋值复制
- 浅复制(复制引用但不复制引用的对象)
- 深复制(复制对象和其应用对象)
- 序列化
package com.jarvis.java;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.*;
/**
* @author jinzhaopo
* @date 2024-01-23 10:19
*/
public class CopyObject {
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
private static class User {
private Long id;
private String name;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
private static class Admin implements Cloneable {
private String key;
private Integer order;
private User user;
@Override
protected Admin clone() throws CloneNotSupportedException {
return (Admin) super.clone();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
private static class Account implements Cloneable {
private String realName;
private Admin admin;
@Override
protected Account clone() throws CloneNotSupportedException {
Account clone = (Account) super.clone();
clone.admin = admin.clone();
return clone;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
private static class Member implements Serializable{
private String name;
private Member member;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
//直接赋值复制
User user = new User(1L, "jzp");
System.out.println(user);
User user1 = user;
user1.setName("java");
System.out.println(user);
System.out.println(user1);
//浅复制
Admin admin = new Admin("one", 1, user);
try {
Admin admin1 = admin.clone();
admin1.setOrder(2);
System.out.println(admin);
System.out.println(admin1);
admin1.getUser().setName("php");
System.out.println(admin);
System.out.println(admin1);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
//深复制
Account account = new Account("jinzhaopo",admin);
try {
Account account1 = account.clone();
System.out.println(account);
System.out.println(account1);
account1.getAdmin().setOrder(2);
System.out.println(account);
System.out.println(account1);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 序列化
Member context = new Member();
context.setName("kk");
Member member1 = new Member("jj",context);
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(member1);
objectOutputStream.close();
byte[] serializedData = byteOutputStream.toByteArray();
// 反序列化
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(serializedData);
ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);
Object obj = objectInputStream.readObject();
objectInputStream.close();
// 处理读取到的对象
if (obj instanceof Member) {
Member result = (Member) obj;
member1.setName("TT");
System.out.println(member1);
System.out.println(result);
}
}
}