但是对于可变类来说,克隆以后对象的值并没有和原对象分离开来,而是相互影响,所以这是浅拷贝的一个缺点。 ? 这样的话,克隆后的对象的值和原来的对象的值互不影响。因为他们指向的是堆内存中不同的内存空间。 ? 实现方案 重写 Object 的 clone 方法,并将每个可变类属性也克隆一次。 Sheep2 s = (Sheep2) obj; // 把可变类属性也进行克隆 s.birthday = (Date) this.birthday.clone() s2 对象的 birthday 是一个新对象 Sheep2 destObject = (Sheep2) originalObject.clone(); 浅克隆拷贝的值(对象的话就是引用值),使用的同一块内存空间。深拷贝拷贝值的同时还创建了内存空间,使用的是不同的内存空间。不可变类对象的拷贝使用浅克隆就行。
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。 如图所示,深克隆和浅克隆之后对象的指向地址差异。 pos:当前对象的地址; son:son属性所指向的地址; name:对象的name属性。 1055780-20190821154716863-900289879.jpg 浅克隆实现: 对象实现Cloneable并重写clone方法不进行任何操作时,调用clone()方法将实现浅克隆。 便捷方式使用HuTool,继承cn.hutool.clone.CloneSupport类或者实现cn.hutool.clone.Cloneable接口 深克隆实现: 将对象流将对象写入流然后再读出。
前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的。 但当对象属性较多时,这样的克隆方式会比较麻烦,所以Object类中实现了clone方法,用于克隆对象,Java中的克隆分为浅克隆与深克隆。 实现克隆的方式 1.对象的类需要实现Cloneable接口 2.重写Object类中的clone()方法 3.根据重写的clone()方法得到想要的克隆结果,例如浅克隆与深克隆。 深克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。 ? ? ,修改被克隆对象的基本属性,并不会影响克隆出来的对象。
“克隆”一词总会让我们想起与生物学相关的科技医学技术,说的就是将动物的细胞取到后进行人工培育,从而培育出一个一模一样的动物(当然也包括人)。 在编程界中同样存在克隆的技术,只不过它与传统的医学不相同的是:它具有浅克隆和深克隆的区别。 此时b1.unCA与b2.unCA指向了两个不同的UnCloneA实例,而且在CloneB b2 = (CloneB)b1.clone();调用的那一刻b1和b2拥有相同的值,在这里,b1.i = b2 = (CloneC)c1.clone(); c2.str = c2.str.substring(0,5); c2.strBuff = c2.strBuff.append(" change strBuff 当然如果我们把最上面的例子中的这两条语句 c2.str = c2.str.substring(0,5); c2.strBuff = c2.strBuff.append(" change strBuff
深克隆(Deep Clone): 将原型对象中所有类型,无论是值类型还是引用类型,都复制一份给克隆对象。 >>>" + park2); Monkey monkey2 = park2.getMonkey(); monkey2.setName("二明"); monkey2 所以这里引入了深克隆。即要克隆类的基本数据类型,以及所有非基本数据类型的属性。 >>>" + park2); } } 输出结果: 这里简单的示例帮助理解深克隆和浅克隆。 深克隆方式 1、实现Cloneable接口 2、使用JDK自带的字节流实现深克隆 3、使用第三方工具类实现深克隆,比如Apache Commons Lang 4、使用Json工具实现深克隆,比如Gson
克隆 浅克隆 浅克隆无法copy数组和对象 var obj = { name : "abs", age : '18', sex : 'male' } var obj1 = {} ;//防止用户不输入target for(var k in Origin){ target[k] = Origin[k]; } } clone(obj,obj1); 深克隆 建立了之后再遍历一遍原始对象或数组里是啥 递归 var obj = { name : 'lin', age : '18', sex : 'male', card : [1,2,3,4
2. 备份数据:磁盘克隆是一种高效的备份方式,尤其是在处理关键数据或复杂系统设置时。 3. 2. 备份重要数据:在开始克隆前,备份目标硬盘上的重要文件,因为克隆过程会覆盖目标硬盘上的所有数据。 3. 下载并安装克隆软件:根据需求选择适合的磁盘克隆工具,并安装到系统中。 2. 启动克隆软件打开软件后,选择“磁盘克隆”或“Disk Clone”功能(不同软件的界面可能略有差异)。 3. 选择源硬盘在软件界面中,选择需要克隆的源硬盘。 检查克隆效果:将目标硬盘连接至电脑并启动系统,检查数据、软件和分区结构是否正常。 2. 优化设置:如果是从机械硬盘迁移到固态硬盘,记得开启SSD的TRIM功能以提升性能。 确保克隆过程中不要中断电源或连接,避免数据损坏。 2. 在克隆之前,验证目标硬盘的健康状态,避免复制到有问题的硬盘上。 3.
你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 你必须将 给定节点的拷贝 作为对克隆图的引用返回。 示例 1: 输入:adjList = [[2,4],[1,3],[2,4],[1,3]] 输出:[[2,4],[1,3],[2,4],[1,3]] 解释: 图中有 4 个节点。 节点 1 的值是 1,它有两个邻居:节点 2 和 4 。 节点 2 的值是 2,它有两个邻居:节点 1 和 3 。 节点 3 的值是 3,它有两个邻居:节点 2 和 4 。 示例 4: 输入:adjList = [[2],[1]] 输出:[[2],[1]] 提示: 节点数不超过 100 。
-C "kangvcar@126.com" [root@kangvcar ~]# cat .ssh/id_rsa.pub 注意:在本地用ssh-keygen生成密钥对后,把公钥添加到github上 2. --global user.name "kangvcar"[root@kangvcar ~]# git config --global user.email "kangvcar@126.com" 4.克隆远程仓库到本地 以上前4步的操作是克隆自己github里的项目到本地 因为我只能把我本地的公钥添加到了我的github上,而不能添加到别人的github账户下,所以只能克隆自己github仓库里的项目,而不能clone 首先肯定不能直接克隆别人的github项目的地址,因为你没有公钥在别人的github仓库里,所以我要像把别人的项目fork到自己的github上,然后在克隆到本地,在本地修改完成后,在提交给原作者。 再用自己仓库里对应项目的地址克隆到本地。 修改完成后,把在本地把所做的修改push推送到自己的github上。
1-02 深克隆与浅克隆 what 定义 深拷贝与浅拷贝 jdk有个接口java.lang.Cloneable 这个接口是空接口,里面什么东西都没有 它的意思是实现了这个接口的类都是可以克隆的 真正实现了clone方法的是java.lang.Object父类 由此可见,每一个类都是有clone()方法的 但是这个clone()只是一个浅克隆方法 浅克隆定义: 复制出来的对象的所有变量都含有与原来的对象相同的值 换言之,深克隆把要克隆的对象所引用的对象都克隆了一遍 图解 浅克隆 ? 深克隆 ? ,但是从内存上看 已经是不同的内存地址了 System.out.println("浅克隆"+(clone == testObject)); System.out.println("浅克隆 ("浅克隆"+clone.hashCode()); // 浅克隆的对象 里面成员属性的 地址应该是一样的, 所以这里equals应该还是true System.out.println("浅克隆
为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 概念 浅克隆: 被克隆的对象里的所有变量值都与原来的对象相同, 而所有对其他对象的引用仍然指向原来的对象. 简单说, 浅克隆仅克隆当前对象, 而不克隆当前对象所引用的对象. 简单说, 深克隆不仅克隆了当前对象, 还把当前对象所引用的对象都复制了一遍. Object中的clone Object类中的clone()方法属于浅克隆. Java序列化克隆 如果引用类型中海包括引用类型, 要实现多层克隆会很麻烦, 这使用可以使用序列化和反序列化的方式实现对象的深克隆. 可以将序列化克隆封装为一个方法, 如下所示: ? 通过该工具类即可进行深度克隆.
Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中。那么什么是深克隆,什么是浅克隆呢。 【浅克隆】,通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。 【深克隆】,克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。 下面的两个例子可以很好的说明他们的区别: 首先看一下类图 ? Husband类有一个对wife的引用,当进行浅克隆的时,wife变量都会指向同一个Wife;而进行深克隆时,会指向不同的Wife。 下面进行一下验证: 【浅克隆】 1 public Object clone() { 2 Husband husband = null; 3 try{ 4 = (Husband)husband.deepClone(); 91 System.out.println("husband2 birthday "+husband2.getBirthday
比如我想看一下JQuery的extend源码,就不得不再好好看看深克隆浅克隆的问题。 ---- 什么是深克隆? 我们都知道,JavaScript有六种基本的数据类型。 ---- 我们还是先看浅克隆吧。。。 看他们的爱好: ---- 一些扩展 js里的concat函数 concat函数对数组进行了深度克隆 var a = [1,2,3]; console.log(a.concat(4,5)); //[1, 2, 3, 4, 5]console.log(a);// [1, 2, 3] jQuery.extend( [deep ], target, object1 [, objectN ] ) deep 类型 类型: Object 一个对象,它包含额外的属性合并到第一个参数. objectN 类型: Object 包含额外的属性合并到第一个参数 1.合并两个对象,并修改第一个对象 b覆盖了a的原有属性: 2.
1.定义 浅克隆(拷贝):复制一个对象的实例,但是这个对象中包含的其它的对象还是共用的。一般用super.clone()方法,clone的对象就是浅克隆。 深克隆(拷贝):复制一个对象的实例,而且这个对象中包含的其它的对象也要复制一份。 2.举例 有如下类Husband, Husband又引用了Wife。 ? = (Husband) husband.deepClone(); System.out.println("husband2 birthday is :"+husband2.getBirthday 当然,实现深克隆的方法并不局限于流这一种办法,还可以通过json等其他办法实现。
对象克隆 对象克隆指的是对象的赋值操作 clone() 方法 protected Object clone() throws CloneNotSupportedException 创建并返回此对象的一个复制副本 实现克隆操作 class Book implements Cloneable { // 实现 Cloneable接口,对象可以被克隆 private String title ; private throws CloneNotSupportedException { return super.clone(); }// 覆写 clone方法,调用父类的clone()方法,可以实现对象克隆 CloneNotSupportedException { Book book_A = new Book("Java",11.1) ; Book book_B = (Book) book_A.clone() ; // 克隆操作 完成 } } 对象克隆的理论价值高于实际价值 重点: 上述的代码中,提到了 标记接口 ,这个概念十分重要关键,标记接口好比一张口令卡一样,只有拿到(实现)标记接口(口令卡)才可以进入一些特定的地方
因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。 并且如果我们对象里面的属性还有非基本类型对象的话也需要实现此接口直到没有属性是非基本类型对象为止(深拷贝) 这里有个不错的例子:http://cqitcs02370236.cnblogs.com/archive/2006/04/23/382644.html 2 顶 2 踩 分享到: 2010-04-23 13:46 浏览 5671 评论 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
4 咋实现克隆? 浅、深克隆主要区别在于是否支持引用类型的成员变量的复制。 杭州市 学生1:123,地址:西湖区 学生2:123,地址:杭州市 最后看API里其中一个实现了clone方法的类: 该类其实也属于深克隆。 浅克隆 如果原型对象的成员变量是值类型,将复制一份给克隆对象 如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象, 即原型对象和克隆对象的成员变量指向相同的内存地址。 深克隆 深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。 除了对象本身被复制外,对象所包含的所有成员变量也将复制。 6 总结 实现对象克隆的两种方式: 实现Cloneable接口并重写Object#clone() 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可实现真正的深克隆 基于序列化和反序列化实现的克隆不仅仅是深度克隆
其实复制、克隆、拷贝表达的都是同一个意思。因为Java中的数据类型分为引用类型和值类型,因此,在克隆数据的过程中,就有了深克隆和浅克隆。 2、深克隆和浅克隆 那么,深克隆和浅克隆的本质区别又是什么呢? 第2点:改变一个值是否会影响到另一个值变化。 那么,到底什么是深克隆,什么是浅克隆呢? 先来看浅克隆,浅克隆就是数据拷贝后,一方数据变化另一方会跟着变化。 如图所示:有原型对象Object,它是引用类型,然后拷贝后产生两个克隆对象obj1和obj2,只是它们克隆的是Object的内存地址,因此ob1和obj2都指向Object,那么Object中的成员变量值发生改变时 ,obj1和obj2指向的成员变量值也就会发生改变。 2、实现Clonenable接口 3、Arrays的copyOf()方法 下面来看深克隆,深克隆就是数据拷贝后,原型对象和克隆对象之间没有关联。
创建对象的四大方法:1、new;2、反射;3、克隆;4、反序列化 今天来看一下如何克隆一个对象出来,克隆分为2种,一种是浅克隆,一种是深克隆。 一、在浅克隆中,如果原型对象的属性是值类型(如int,double,byte,boolean,char等),将复制一份给克隆对象;如果原型对象的属性是引用类型(如类,接口,数组,集合等复杂数据类型),则将引用对象的地址复制一份给克隆对象 深克隆就是让克隆对象的引用属性跟原型对象没有关系,由浅克隆的特性,我们可以知道,克隆出来的对象本身与原型对象是不同的内存地址的,由此我们可以将引用类型也添加克隆的特性,这样就可以将引用类型也分离出来。 , 111, 110, 101, 46, 87, 101, 101, 107, 108, 121, 76, 111, 103, -10, -93, 81, -98, -8, -9, -59, 96, 2, 0, 1, 76, 0, 4, 110, 97, 109, 101, 113, 0, 126, 0, 2, 120, 112, 116, 0, 6, -23, -103, -124, -28, -69
如果clone时出现warning: You appear to have cloned an empty repository.