java中的clone方法
Java中对象的创建
复制对象 or 复制引用
- Person p = new Person(23, "zhang");
- Person p1 = p;
- System.out.println(p);
- System.out.println(p1);
当Person p1 = p;执行之后, 是创建了一个新的对象吗? 首先看打印结果:
com.pansoft.zhangjg.testclone.Person@2f9ee1ac
- Person p = new Person(23, "zhang");
- Person p1 = (Person) p.clone();
- System.out.println(p);
- System.out.println(p1);
从打印结果可以看出,两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量:
com.pansoft.zhangjg.testclone.Person@67f1fba0
深拷贝 or 浅拷贝
- public class Person implements Cloneable{
- private int age ;
- private String name;
- public Person(int age, String name) {
- this.age = age;
- this.name = name;
- }
- public Person() {}
- public int getAge() {
- return age;
- }
- public String getName() {
- return name;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return (Person)super.clone();
- }
- }
- Person p = new Person(23, "zhang");
- Person p1 = (Person) p.clone();
- String result = p.getName() == p1.getName()
- ? "clone是浅拷贝的" : "clone是深拷贝的";
- System.out.println(result);
覆盖Object中的clone方法, 实现深拷贝
- static class Body implements Cloneable{
- public Head head;
- public Body() {}
- public Body(Head head) {this.head = head;}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- static class Head /*implements Cloneable*/{
- public Face face;
- public Head() {}
- public Head(Face face){this.face = face;}
- }
- public static void main(String[] args) throws CloneNotSupportedException {
- Body body = new Body(new Head());
- Body body1 = (Body) body.clone();
- System.out.println("body == body1 : " + (body == body1) );
- System.out.println("body.head == body1.head : " + (body.head == body1.head));
- }
在以上代码中, 有两个主要的类, 分别为Body和Face, 在Body类中, 组合了一个Face对象。当对Body对象进行clone时, 它组合的Face对象只进行浅拷贝。打印结果可以验证该结论:
body.head == body1.head : true
- static class Body implements Cloneable{
- public Head head;
- public Body() {}
- public Body(Head head) {this.head = head;}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- Body newBody = (Body) super.clone();
- newBody.head = (Head) head.clone();
- return newBody;
- }
- }
- static class Head implements Cloneable{
- public Face face;
- public Head() {}
- public Head(Face face){this.face = face;}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- public static void main(String[] args) throws CloneNotSupportedException {
- Body body = new Body(new Head());
- Body body1 = (Body) body.clone();
- System.out.println("body == body1 : " + (body == body1) );
- System.out.println("body.head == body1.head : " + (body.head == body1.head));
- }
打印结果为:
body.head == body1.head : false
真的是深拷贝吗
- static class Body implements Cloneable{
- public Head head;
- public Body() {}
- public Body(Head head) {this.head = head;}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- Body newBody = (Body) super.clone();
- newBody.head = (Head) head.clone();
- return newBody;
- }
- }
- static class Head implements Cloneable{
- public Face face;
- public Head() {}
- public Head(Face face){this.face = face;}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- static class Face{}
- public static void main(String[] args) throws CloneNotSupportedException {
- Body body = new Body(new Head(new Face()));
- Body body1 = (Body) body.clone();
- System.out.println("body == body1 : " + (body == body1) );
- System.out.println("body.head == body1.head : " + (body.head == body1.head));
- System.out.println("body.head.face == body1.head.face : " + (body.head.face == body1.head.face));
- }
打印结果为:
body.head == body1.head : false
body.head.face == body1.head.face : true
如何进行彻底的深拷贝
- static class Head implements Cloneable{
- public Face face;
- public Head() {}
- public Head(Face face){this.face = face;}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- //return super.clone();
- Head newHead = (Head) super.clone();
- newHead.face = (Face) this.face.clone();
- return newHead;
- }
- }
- static class Face implements Cloneable{
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
再次运行上面的示例,得到的运行结果如下:
body.head == body1.head : false
body.head.face == body1.head.face : false
写在最后
java中的clone方法的更多相关文章
- 详解Java中的clone方法
详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...
- 详解Java中的clone方法:原型模式
转:http://developer.51cto.com/art/201506/478985.htm clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的 ...
- 转:Java中的Clone()方法详解
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- Java中的clone方法-理解浅拷贝和深拷贝
最近学到Java虚拟机的相关知识,更加能理解clone方法的机制了 java中的我们常常需要复制的类型有三种: 1:8种基本类型,如int,long,float等: 2:复合数据类型(数组): 3:对 ...
- 详解Java中的clone方法 -- 原型模式
转自: http://blog.csdn.net/zhangjg_blog/article/details/18369201 Java中对象的创建 clone顾名思义就是复制, 在Java语言中, ...
- JAVA中的clone方法剖析
原文出自:http://blog.csdn.net/shootyou/article/details/3945221 java中也有这么一个概念,它可以让我们很方便的"制造"出一个 ...
- 深入浅出| java中的clone方法
每天进步一丢丢,连接梦与想 我们还年轻,但这不是你浪费青春的理由 克隆和复制 clone,有人称之为克隆,有人称之为复制,其实都是同一个东西 本文称之为"克隆",毕竟人家方法名叫& ...
- Java中有关clone方法的用法
一.clone在数组基本数据类型中的使用 public class Main { public static void main(String[] args) { int[] arr= {7,8,9} ...
- 详解Java中的clone方法 -- 原型模式 及源码
http://www.cnblogs.com/cq-home/p/6431426.html http://blog.csdn.net/zhangjg_blog/article/details/1836 ...
随机推荐
- python遍历当前目录并删除某文件
#coding: utf-8 """ this programe is to clear driverlog below this dir __author__:the_ ...
- linuxshell编程之变量
变量分类: 用户自定义变量:局部变量 定义格式:变量名=变量值(*等号左右不能有空格,加了空格会报错) 调用格式:echo $变量名(调用的是变量名等效的值) 变量叠加:$x=123,y=" ...
- 《学习bash》笔记--调试shell程序
在shell中,最简单的调试助手时输出语句echo,能够通过把很多echo语句放到代码中进行调试,但必须花费足够的时间以定位 要查看的信息.可能必须通过很多的输出才干发现要查找的信息. 1.set选项 ...
- IE对CSS样式的数量和大小的限制
项目中遇到的问题,css写的样式无法渲染,各种百度后发现大概是这个原因: IE对CSS样式的数量和大小的限制 文档中只有前31个link或style标记关联的CSS能够应用. 从第32个开始,其标记关 ...
- Oracle 连接、会话数的查看,修改
http://blog.csdn.net/xiaoyao6650/article/details/4027041 查看processes #当前的连接数 select count(*) from v$ ...
- c#中使用ABCpdf处理PDF,so easy
QQ交流群:276874828 (ABCpdf ) 这几天项目中需要将页面导成PDF,刚开始使用iTextSharp,觉得在分页处理上比较复杂,后来无意中看到了ABCpdf,使用非常简单,并将一些常 ...
- LOL英雄联盟代打外挂程序-java实现
相信非常多程序员都玩游戏,比方LOL :有时候想打人机对战(玩家对战小心别人举报你! ),纯属为了拿经验和金币,而本身不想玩,但假设玩家不操作.那么非常快就会被系统觉得是挂机,从而得不到经验和金币.所 ...
- matlab2017b linux版分享
链接:https://pan.baidu.com/s/1smrTkFN 密码:cvb3 下载后请点关注并点赞,谢谢支持.
- EntityFramework 6.0 修改一个已经存在的对象
public void UpdateObj(someobject obj) { db.Entry(obj).State = EntityState.Modified; db.SaveChanges() ...
- servletResponse 控制浏览器缓存
//当访问一些资源文件时,我们希望,访问一次后,资源文件能够在缓存在浏览器中,当我们再次访问该资源时 //直接从缓存中去取,这样可以减少服务器的压力 package response; import ...