内容简介:何谓深浅?程度而已。被克隆的类实现然后,克隆时只须调用我们刚刚覆盖的
何谓深浅?程度而已。
克隆:复制一份
被克隆的类实现 Cloneable
接口,覆盖 clone()
方法,返回调用父类的 clone()
即可。
public class Person implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } //...省略其余代码 }
然后,克隆时只须调用我们刚刚覆盖的 clone()
。
浅拷贝
现在有 Child
类:
public class Child{ //...省略其余代码 }
还有 Person
类:
public class Person implements Cloneable{ private int age; private String name; private Child child; //...省略其余代码 }
克隆Person对象p1赋给p2,然后我们看看他们的 toString()
和 hashCode()
结果:
public class Main { public static void main(String[] args) throws CloneNotSupportedException { Person p1 = new Person("zhangsan",23); p1.setChild(new Child("xiaoming", 1);); //克隆操作 Person p2 = p1.clone(); //打印看看 System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode()); System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode()); } }
输出:
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733 Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733
结论:p1,p2成员的值相等,但它们是两个不同的对象,他们的Child成员是同一个对象。
深拷贝
给 Child
也实现 Cloneable
接口并覆盖 clone()
:
public class Child implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { return super.clone();; } //...省略其余代码 }
然后,改变 Person
类的 clone()
的实现:
public class Person implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { Person p = (Person)super.clone(); p.setChild((Child)child.clone()); return p; } //...省略其余代码 }
然后再调用上面的 main(String [] args)
,结果是:
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733 Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170
结论:p1,p2是两个不同的对象,他们的Child成员也是两个不同的对象。
总结
克隆就是复制一份。
浅拷贝就是简单复制值,如果有引用成员,他们的引用成员将是同一个对象,深拷贝则不为然。
为什么呢
可以这样认为,调用谁的 clone()
就是就是对谁深拷贝。
在上面浅拷贝的例子中,因为调用了 p1
对象的 clone()
,所以 p1
和 p2
是两个不同的对象(对p1,p2本身深拷贝);在深拷贝的例子中,不但调用了 p1
的 clone()
,也调用 Child
类型对象的 clone()
,所以两个 Child
类型对象不同(对所有对象深拷贝)。
思考
基于上述例子,如何实现 Person
类的 clone()
,使得只对 Child
成员进行深拷贝,而不对 Person
本身深拷贝?
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何克隆一个大 Git 项目
- VMware克隆虚拟机过程图示
- Java实现对象克隆的方法
- 主机ping不通克隆的虚拟机
- VMware 下快速克隆出多个 Linux 环境
- VMware 下快速克隆出多个 Linux 系统
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Development Recipes
Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00
You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!