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 ...
随机推荐
- Mac 奇淫巧技 哈哈
1. 设置别名 sudo vim ~/.bash_profile alias ll='ls -lhF' alias la='ls -hlAF' alias c='clear' alias rm='ls ...
- flask的httponly默认值为True
如图flask的app.py里显示app的默认配置,httponly默认值为true,所以如果开发者不修改这个配置的话,攻击者是无法通过xss攻击读取浏览器cookie这部分信息的. Cookie:s ...
- 线段树专题—ZOJ1610 Count the Colors
题意:给一个n,代表n次操作,接下来每次操作表示把[l.r]区间的线段涂成k的颜色当中,l,r,k的范围都是0到8000 分析:事实上就是拿线段树维护一段区间的颜色,整体用到的是线段树的区间更新把,可 ...
- 点击页面li显示li中文字
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- AngularJS中选择样式
代码下载:https://files.cnblogs.com/files/xiandedanteng/angularJSSelectClass.rar 要点,{{ctrl.name}}比<spa ...
- 版本号控制软件:TortoiseSVN高速上手
百度百科对于SVN的一点解释: TortoiseSVN是Subversion版本号控制系统的一个免费开源client,能够超越时间的管理文件和文件夹.文件保存在中央版本号库,除了能记住文件和文件夹的每 ...
- Win7如何解决精简版的迅雷7无法运行
网上下载msvcp71.dll和msvcr71.dll把文件放到System32目录下即可 http://www.baidu.com/s?wd=msvcp71.dll&ie=utf-8&a ...
- [Python] SQLBuilder 演示样例代码
用Python写一个SQLBuilder.Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到. 附 ...
- cart算法
- php创建无限极目录代码
php创建无限极目录代码 <?php //无限级目录 function dirs($path,$mode=0777){ if(is_dir($path)){ echo '目录已经存在!'; }e ...