java中深拷贝和浅拷贝的区别

来源:互联网 发布:mac linux双系统 编辑:程序博客网 时间:2024/05/16 13:07
今天上课学到了Cloneable接口,自然我们在使用clone()方法的时候,涉及到了java中的浅拷贝和深拷贝的问题。下面通过在网上看一下资料,做一个小小的总结。

(1)浅拷贝
浅拷贝是指对象中基本数据类型得到拷贝,而引用数据类型并没有拷贝。看下面一段代码:

public class Person implements Cloneable{
 
 private int age = 20;
  private String name = "fangleijiang";
 private Date date;
 public int getAge()
  {
 return age;
 } 
 public void setAge(int age) 
{ this.age = age; }
  public String getName() 
{ return name; } 
  public void setName(String name)
  { this.name = name; } 
  public Date getDate() 
{ return date; }
  public void setDate(Date date) 
{ this.date = date; } 
 public static void main(String[] args) throws CloneNotSupportedException { 
  Person p1 = new Person();
  Date date = new Date(); 
  p1.setDate(date);
 Person p2 = (Person) p1.clone(); //克隆对象
 System.out.println(p1.getAge());
 System.out.println(p2.getAge()); 
  System.out.println(p1.getDate());
  System.out.println(p2.getDate());
  if(p1.getDate()==p2.getDate())
 System.out.println("true"); 
 } 
  else{ 
 System.out.println("false"); 
  } 
 }
}

输出结果 
从结果中我们可以看出,两个对象p1和p2的年龄和日期的值都是一样的,但是当我们比较的两个日期的内存地址的时候,发现输出结果是true,这说明,p2对象只是拷贝了date的值,并没有拷贝对象p1里面的date对象。
我们可以通过下图来表示

(2)深拷贝
相对于浅拷贝来说,既实现了对象中基本数据类型的拷贝,也实现了引用数据类型的拷贝。
       看下面一段测试程序

public static void main(String[] args) throws CloneNotSupportedException { 
  Person p1 = new Person();
  Date date = new Date(); 
  p1.setDate(date);
Person p2 = (Person) p1.clone(); //克隆对象
p2.setDate((Date)p1.getDate().clone());//注意这是和浅拷贝不同的地方
 System.out.println(p1.getAge());
 System.out.println(p2.getAge()); 
  System.out.println(p1.getDate());
  System.out.println(p2.getDate());
  if(p1.getDate()==p2.getDate())
 System.out.println("true"); 
 } 
  else{ 
 System.out.println("false"); 
  } 
 }
输出结果如下图

从最后一个结果输出false,我们可以知道,这两个时间对象并不是同一个引用变量,所以深拷贝不仅实现了p1对象的基本数据类型的拷贝,还实现了引用数据类型的拷贝。
我们可以通过下图来表示深拷贝的原理:



本人初学者,如有说的不正确的地方,欢迎各位给我留言。

原创粉丝点击