今天上课学到了Cloneable接口,自然我们在使用clone()方法的时候,涉及到了java中的浅拷贝和深拷贝的问题。下面通过在网上看一下资料,做一个小小的总结。
从结果中我们可以看出,两个对象p1和p2的年龄和日期的值都是一样的,但是当我们比较的两个日期的内存地址的时候,发现输出结果是true,这说明,p2对象只是拷贝了date的值,并没有拷贝对象p1里面的date对象。
(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");
}
}
}
我们可以通过下图来表示
(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");
}
}
输出结果如下图
我们可以通过下图来表示深拷贝的原理:
本人初学者,如有说的不正确的地方,欢迎各位给我留言。