Java中实现深拷贝与浅拷贝的方式有哪些

  

Java中实现深拷贝与浅拷贝的方式有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。


浅拷贝就是获得拷贝对象的引用,而不是正真意义上的拷贝一个对象,例如

,A  A =, new  ();   ,A  b =,,

此时引用变量a和b同时指向了同一个堆中的内存空间,变量b只是复制了实例一的引用地址,并不是重新在堆中开辟了一个新的空间位置,来完整的复制实例一个如图

癑ava中实现深拷贝与浅拷贝的方式有哪些"

深拷贝

深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。深拷贝则是真正意义上的<代码>拷贝>

癑ava中实现深拷贝与浅拷贝的方式有哪些"

深拷贝和浅拷贝的区别

简单来说就是一句话:深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

浅拷贝的实现

首先,我们定义一下需要拷贝的简单对象。

public  class 学生{   ,private  String 名称;   ,private  int 年龄;,,   ,private  String 性别;   }         public  class  School  {   ,private  String  schoolName;   ,private  int  stuNums;   ,private  Student 斯图;   }

如上述代码,我们定义了一个学生学生类,包含名字姓名,和年龄年龄,性性别,而是另一个学校类,包含schoolName学校名称和stuNums学生数量以及学生学生,其中学生并不是字符串,而是一个学生类。接下来我们将详细描述如何签拷贝学校对象。
我们看如下这段代码:

public  class 学生{   private 才能;String 名称;   private 才能;int 年龄;   private 才能;String 性别;   ,,   public 才能;String  getName (), {   ,,,return 名称;   ,,}   public 才能;void  setName (String 名称),{   ,,,this.name =,名称;   ,,}   public 才能;int  getAge (), {   ,,,return 年龄;   ,,}   public 才能;void  setAge (int 年龄),{   ,,,this.age =,年龄;   ,,}   public 才能;String  getSex (), {   ,,,return 性别;   ,,}   public 才能;void  setSex (String 性),{   ,,,this.sex =,性;   ,,}   @Override才能   public 才能;String  toString (), {   ,,,return “Student  [name=? +, name  +,,,,岁=?+,age  +,,,,性=?+,sex  +,“]”;   ,,}   } public  class  School  implements 可克隆{   private 才能;String  schoolName;   private 才能;int  stuNums;   private 才能Student 斯图;   ,,   public 才能;String  getSchoolName (), {   ,,,return  schoolName;   ,,}   public 才能;void  setSchoolName (String  schoolName), {   ,,,this.schoolName =, schoolName;   ,,}   public 才能;int  getStuNums (), {   ,,,return  stuNums;   ,,}   public 才能;void  setStuNums (int  stuNums), {   ,,,this.stuNums =, stuNums;   ,,}   public 才能;Student  getStu (), {   ,,,return 斯图;   ,,}   public 才能;void  setStu (Student 斯图),{   ,,,this.stu =,斯图;   ,,}   @Override才能   protected 才能;School 克隆(),throws  CloneNotSupportedException  {   ,,,//,TODO  Auto-generated  method 存根   ,,,return (学校)super.clone ();   ,,}   @Override才能   public 才能;String  toString (), {   ,,,return “School  [schoolName=? +, schoolName  +,,,, stuNums=? +, stuNums  +,,,,斯图=?+,stu  +,“]”;   ,,}   }

这是一个我们要进行赋值的原始类学校。下面我们产生一个学校对象,并调用其克隆方法复制一个新的对象。
<强>注意:调用对象的克隆方法,必须要让类实现可克隆接口,并且覆写克隆方法。

public  class  TestClone  {   public 才能;static  void  main (String [], args), throws  CloneNotSupportedException  {   ,,,//创建初始的学校对象   ,,,School  s1 =, new 学校();   ,,,s1.setSchoolName (“xx大学“);   ,,,s1.setStuNums (2000);   ,,,Student  stu1 =, new 学生();   ,,,stu1.setAge (20);   ,,,stu1.setName(“肉丁“);   ,,,stu1.setSex(“女“);   ,,,s1.setStu (stu1);   ,,,School  s2 =, s1.clone();,//调用重写的克隆方法,克隆出一个新的学校——s2   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Java中实现深拷贝与浅拷贝的方式有哪些