天天看点

java clone 深拷贝_java clone 浅拷贝 和 深拷贝

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);

}

}