package com.fwz.tproject;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.Serializable;
import org.junit.Test;
import lombok.Data;
public class CloneTest1 implements Serializable {
@Data
public class Person implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
private Address address;
public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
p.address = (Address) p.address.clone();
return p;
}
}
@Data
public class Address implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private String type;
private String value;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
@Test
public void testShallowCopy() throws Exception {
Address address = new Address();
address.setType("Home");
address.setValue("北京");
Person p1 = new Person();
p1.setAge(31);
p1.setName("Peter");
p1.setAddress(address);
Person p2 = (Person) p1.deepClone();
System.out.println(p1 == p2);// false
p2.setAge(44);
p2.getAddress().setType("Office");
System.out.println("p1=" + p1);
System.out.println("p2=" + p2);
}
@Test
public void testShallowCopy2() throws Exception {
Address address = new Address();
address.setType("Home");
address.setValue("北京");
Person p1 = new Person();
p1.setAge(31);
p1.setName("Peter");
p1.setAddress(address);
Person p2 = (Person) p1.clone();
System.out.println(p1 == p2);// false
p2.setAge(44);
p2.getAddress().setType("Office");
System.out.println("p1=" + p1);
System.out.println("p2=" + p2);
}
}