深拷贝和浅拷贝
1、浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
2、深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
3、浅拷贝(clone)示例代码
public class Student implements Cloneable
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
@Override
public Object clone() throws CloneNotSupportedException
{
return super.clone();
}
}
public class Teacher implements Cloneable
{
private String name;
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", student=" + student + "]";
}
@Override
public Object clone() throws CloneNotSupportedException
{
return super.clone();
}
}
public class Test
{
public static void main(String[] args)
{
Teacher wangLaoShi = new Teacher();
wangLaoShi.setName("王");
Student student1 = new Student();
student1.setName("张三");
wangLaoShi.setStudent(student1);
System.out.println();
// 打印结果一样 初步证明使用clone浅拷贝成功
Teacher xLaoShi = new Teacher();
try
{
xLaoShi = (Teacher) wangLaoShi.clone();
} catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=王, student=Student [name=张三]]
*/
// 修改原老师的姓名和学生的姓名,复制的x老师的老师姓名没有跟着变化,学生姓名跟着原老师的学生姓名变化,证明是浅拷贝。
wangLaoShi.setName("张");
wangLaoShi.getStudent().setName("李四");
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=李四]]
Teacher [name=张, student=Student [name=李四]]
*/
}
}
4、深拷贝(clone)示例代码
public class Student implements Cloneable
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
@Override
public Student clone() throws CloneNotSupportedException
{
return (Student)super.clone();
}
}
public class Teacher implements Cloneable
{
private String name;
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", student=" + student + "]";
}
@Override
public Teacher clone() throws CloneNotSupportedException
{
Teacher teacher = (Teacher) super.clone();
teacher.setStudent((Student)teacher.getStudent().clone());
return teacher;
}
}
public class Test
{
public static void main(String[] args)
{
Teacher wangLaoShi = new Teacher();
wangLaoShi.setName("王");
Student student1 = new Student();
student1.setName("张三");
wangLaoShi.setStudent(student1);
System.out.println();
// 打印结果一样 初步证明使用clone深拷贝成功
Teacher xLaoShi = new Teacher();
try
{
xLaoShi = wangLaoShi.clone();
} catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=王, student=Student [name=张三]]
*/
// 修改原老师的姓名和学生的姓名,复制的x老师的老师姓名,学生姓名没有跟着变化,证明是深拷贝。
wangLaoShi.setName("张");
wangLaoShi.getStudent().setName("李四");
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=张, student=Student [name=李四]]
*/
}
}
5、深拷贝(序列化)示例代码
public class Student implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 2808612254630368408L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
public class Teacher implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 3337955056649739635L;
private String name;
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", student=" + student + "]";
}
}
public class Test
{
@SuppressWarnings("resource")
public static void main(String[] args)
{
Teacher wangLaoShi = new Teacher();
wangLaoShi.setName("王");
Student student1 = new Student();
student1.setName("张三");
wangLaoShi.setStudent(student1);
System.out.println();
try
{
//序列化
OutputStream outputStream = new FileOutputStream(new File("E:/Teacher.txt"));
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(wangLaoShi);
//反序列化
InputStream inputStream = new FileInputStream(new File("E:/Teacher.txt"));
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Teacher xLaoShi = (Teacher) objectInputStream.readObject();
//打印结果一样 初步证明序列化深拷贝成功
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=王, student=Student [name=张三]]
*/
// 修改原老师的姓名和学生,复制的x老师,没有跟着变化,证明使用序列化深拷贝成功。
wangLaoShi.setName("张");
wangLaoShi.getStudent().setName("李四");
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=张, student=Student [name=李四]]
*/
} catch (Exception e)
{
e.printStackTrace();
}
}
}
6、深拷贝(自定义)示例代码
public class Student
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
public class Teacher
{
private String name;
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Teacher copy(Teacher teacher)
{
Student student = new Student();
student.setName(teacher.getStudent().getName());
this.student = student;
this.name = teacher.getName();
return teacher;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", student=" + student + "]";
}
}
public class Test
{
public static void main(String[] args)
{
Teacher wangLaoShi = new Teacher();
wangLaoShi.setName("王");
Student student1 = new Student();
student1.setName("张三");
wangLaoShi.setStudent(student1);
System.out.println();
// 打印结果一样 初步证明自定义深拷贝成功
Teacher xLaoShi = new Teacher();
xLaoShi.copy(wangLaoShi);
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=王, student=Student [name=张三]]
*/
// 修改原老师的姓名和学生,复制的x老师,没有跟着变化,证明自定义深拷贝成功。
wangLaoShi.setName("张");
wangLaoShi.getStudent().setName("李四");
System.out.println(xLaoShi);
System.out.println(wangLaoShi);
/*
Teacher [name=王, student=Student [name=张三]]
Teacher [name=张, student=Student [name=李四]]
*/
}
}