浅克隆和深克隆是什么?
首先要知道在java和c不一样,在java里是引用传递,不是值传递。
例如: Student s = new Student();
Student s2 = s; 在这里s2和s保存的是 new Student() 这个对象的地址值,他们两个指向的都是同一个对象,在堆内存也只开辟了一个new Student的内存。
所以当用 s.name = "周某欧"的时候 s2.name 打印出来也会是“周某欧”.
知道这个概念之后就可以理解浅克隆和深克隆的区别了,深克隆的意思就是在内存中重新开辟了一个对象的内存来存储这个对象,然后把这个对象的地址值传给需要克隆的引用对象。是这对个对象的所有,也包括对象里面所引用的对象,这个就是深克隆,所以当一个对象的层级比较高的时候(就是对象里套引用对象套的多的时候),要深克隆就比较繁琐。相对而言的就是浅克隆(我的个人理解,欢迎指正)。就是看引用类型成员变量有没有克隆,深克隆就是连对象的成员变量的对象也要克隆。并不只是复制了个引用。
说到这里,那克隆有什么作用呢?像在开发的时候,对一个对象中的属性都已经设置了一些值,而我们要重新new一个类似的对象,不能重新new个对象 然后再重新赋值把?如果对象里面的成员变量多的时候就比较复杂了,所以就要用到克隆了,克隆个一样的已经赋过值的对象。
怎么实现克隆呢?
实现克隆的接口(implement cloneable) 然后重写clone()方法(因为clone方法是Object类的方法,object是所有类的父类,默认的);
clone(){
return super.clone();
}
这个就是浅克隆了。
实现深克隆就有多中方法了:
1: 也是重写clone方法,然后在给clone之后的对象手动赋值,需要复制的值。这个就比较emmm......................
clone(){
return super.clone().setName = "周某欧";
}
2:第二种可以有多种,就是类型转化,比如用JSON数据转化,阿里巴巴的fastJSON包引入依赖,
Student clone = JSONObject.parseObject(JSONObject.toJSONBytes(Student));
3:第三种就是要用到序列化和反序列化,使用到 IO 流来实现。inputStream 和 outputStream
参考: 什么是序列化?序列化有什么作用?