拷贝的定义
当我们创建了一个类,依旧还是那个熟悉的学生类。现在我想把它拷贝出来,可能首先出来的就是创建一个学生对象然后一次的引用进行赋值,行,但是复杂了。接下来我们的Cloneabale闪亮登场了,它是个接口,里面没有内容,但是用到它的类就说明是可以被clone的。
然后直接上代码
class Student implements Cloneable{
public String name;
public Student(String name){
this.name=name;
}
@Override
public String toString() {
return “Student{” +
“name='” + name + ‘’’ +
‘}’;
}
}
既然要克隆,就得有clone呀,所以得重写clone函数,?不是刚刚说Clonebale中啥也没吗
按住Ctrl然后点击Cloneable查看,确实什么也没,因为object是所有官方类的父类,所以这里要重写的clone是来自Cloneable的父类的。
后面抛出的异常为编译异常,需要进行处理,等下面看主函数是怎么操作的就行
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
准备工作做完了,接下来就是进行调用函数了
将上面抛出的异常直接复制到这
public static void main(String[] args) throws CloneNotSupportedException {
Student student=new Student(“zhansan”);
//这里需要做的是进行强制类型转换,属于一个向下转型,clone返回的为一个object类型,所以需要强制转换,具体的Ctrl加点击去看吧
Student student1=(Student) student.clone();
}
接下来输出所创建的两个对象就行了
输出你会发现你的对象2已结克隆到了对象1,然后对对象2的值进行修改,你会发现对象1的值依旧是对象1的值。
student1.name=“lisi”;
可以看出,对象2的修改对对象1是没有影响的。
深拷贝
那什么是深拷贝呢?
我们再创建一个money类,并且在学生类里面进行new一个对象去引用里面的money下面看代码
class Money implements Cloneable{
public double money=12.25;
}
然后在学生类里面引用它
public Money m=new Money();
然后再次运行对两个对象引用到的m.money进行输出,
都是12.5,然后我们对对象2的m.money进行修改。输出发现对象1的值也被修改了。这是怎么回事呢?
重新来理解一下克隆这个对象吧,刚开始我们对name进行操作的时候,对象2的改变是不会影响对象1的值的,所以我们的name所划分的空间是克隆成功了的,但是我们m所开辟空间里面的money好像并没有克隆,还是用的同一个地址。这时候就需要我们的深拷贝了,上代码:
class Money implements Cloneable{
public double money=12.25;
//重写clone方法
//代表着Money就可以被克隆了
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Student implements Cloneable{
public String name;
public Money m=new Money();
public Student(String name){
this.name=name;
}
@Override
public String toString() {
return “Student{” +
“name='” + name + ‘’’ +
‘}’;
}
//再次运行发现Money还是未被克隆,根本没有用它这是因为
//以下函数返回的为objec类,掉用的是父类的克隆
//所以还需在此将m.出的对象进行克隆
@Override
protected Object clone() throws CloneNotSupportedException {
Student student=(Student) super.clone();
student.m=(Money) this.m.clone();
return student;
}
}
这样做后再次运行,对象2修改的money就不会影响对象1中的money了
student1.m.money=13;
System.out.println(student.m.money);
System.out.println(student1.m.money);
好了,总结一下。克隆是对当前类里面的对象就行克隆,若当前对象又开辟了新的类,这时候若需要另一个值,则就需要深拷贝了。