深拷贝和浅拷贝(完整实例)

深拷贝和浅拷贝

  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=李四]]
	     */
	}
}

发布了56 篇原创文章 · 获赞 1 · 访问量 1168

猜你喜欢

转载自blog.csdn.net/atu1111/article/details/105367571
今日推荐