说到克隆,本质都是使用一个已经实例化完成的对象的副本。
对于基本类型比较简单。比方说我们想复制一个变量,
int index = 12345;
很简单,
int indexCopy = index;
如果我们想复制一个对象呢,情况就变的有点复杂
Student student1 = new Student();("Michael");Student student2 = student1;
啧啧,作为新手,通常会会觉得这样的就完成了复制。
但实际情况是,当我们对 student1的 name进行更改时,student2的值就会被一起改变。
上面这个其实只是引用复制,大家都指向堆里的同一个引用,自然当数据发生变化时也会一起改变。
那么如何正确复制对象呢,这里就得说一下java的Clone。
克隆
Java的克隆允许复制一个一模一样内容的对象出来,当改变A内容时,被克隆的B的内容不会一起改变。
为什么要克隆呢?其实很简单,当我们复制了一个对象的引用,新对象的数据在发生变更时会同时修改原对象的数据。而这并不是我们想要的,我们只想修改新对象的数据。克隆可以解决这种场景。
这里面有两种克隆,浅克隆和深克隆。
浅克隆- shallow clone
不管是浅克隆还是深克隆,都要先实现 Clonable接口,然后复写 clone()方法并改为 public。
举例有个 Student类
public class Student implements Clonebale{ String name; @Override public Object clone() { Student stu = null; try{ stu = (Studen(); }catch(CloneNotSupportedException e) { e.printStackTrace(); } return stu; }}
然后我们从student1复制一个对象student2出来,
("Michael");Student student2 = ();("Rachel");
这时候我们再打印两个对象的值,就会发现这是两个完全不同的对象,分别叫 Michael和 Rachel了。
深克隆 – deep clone
当情况变的更复杂一点,比如在Student里引入一个对象 subject
class Subject { String title;}class Student implement Cloneable{ String name; Subject subject;}
这时候我们再用student1克隆出student2的结果就会变成,
name字段是一样的,然而subject字段却保持和student1
一样。
如果我们想把克隆对象里的非基本类型也一并克隆的话,那么需要把引用的类型也同样实现克隆接口。
也就是说,subject类也需要实现 Cloneable
class Subject implements Clonable{ String title; @Override public Object clone() { …. }}
这样便成为深克隆了。
最后一种克隆方法
如果我们想克隆的对象有多个层次的类型引用,这时候把每一个类型都实现 Clonable接口是不现实的。
那么可以用序列化和发序列化的方法来实现克隆。
大家能分清这对clone姐妹吗?
更多干货,大家请看吧主上传的视频教程,轻松搞笑搞定java高级技术 O(∩_∩))O
1.文章《(java怎么克隆)java深度克隆》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《(java怎么克隆)java深度克隆》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好