浅拷贝:拷贝对象时,其中的“子对象”未拷贝(地址与原对象相同)。
深拷贝:拷贝对象时,将其中的“子对象”也拷贝一份(地址与原对象不同)。
如何判断拷贝对象的子对象的地址是否与原对象的子对象地址相同?(==与equals的区别:==两边放的是对象时,比较两个对象的地址是否指向同一地址)
package xyh.learn.clonetest;
/**
* 这是一个地址类,用于存放学生地址
* @author xyh
*
*/
public class Addrss implements Cloneable{
private String addrssString;
public String getAddrssString() {
return addrssString;
}
public void setAddrssString(String addrssString) {
this.addrssString = addrssString;
}
public Addrss(String addrssString) {
super();
this.addrssString = addrssString;
}
/**
* 实现了clone方法
*/
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
下面是该示例的重点部分,在实现clone方法时,区别是浅拷贝还会深拷贝
package xyh.learn.clonetest;
/**
* 这是学生类,存放学生信息
* @author xyh
*
*/
public class Student implements Cloneable{
private int age;
private String name;
private Addrss addrss;
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 Addrss getAddrss() {
return addrss;
}
public void setAddrss(Addrss addrss) {
this.addrss = addrss;
}
public Student() {
super();
}
public Student(int age, String name, Addrss addrss) {
super();
this.age = age;
this.name = name;
this.addrss = addrss;
}
/**
* 重写clone方法(对比浅克隆与深克隆)
*/
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
//重写clone方法,实现对Student类的浅拷贝
return (Student)super.clone();
/**
* 重写clone方法,实现整个Student类的深拷贝
*/
/*Student newstu=(Student)super.clone();
newstu.addrss=(Addrss)addrss.clone();
return newstu ;*/
}
}
下面是测试代码:
package xyh.learn.clonetest;
public class CloneText {
public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub
Addrss addrss=new Addrss("地址");
Student student=new Student(11,"阿达",addrss);
//将student拷贝到student2中
Student student2=(Student) student.clone();
//==号判断的是两个Addrss所指向的地址是否相同
String result=student.getAddrss()==student2.getAddrss()?"是浅拷贝":"是深拷贝";
//输出结果
System.out.println("对于子对象Addrss的拷贝是:"+result);
//String是一个类,而不是基础数据类型。
//因为String中没有实现Cloneable中的clone方法,所以String是浅拷贝的
System.out.println(student.getAddrss().getAddrssString()==student2.getAddrss().getAddrssString()?"是浅拷贝":"是深拷贝");
}
}
下面是对于浅拷贝的运行结果,如果想测试深拷贝与浅拷贝,可以对Student类中的clone方法中的两种情况进行测试。
可以通过阅读String类,分析为何第二个结果也是前拷贝。