`
zyslovely
  • 浏览: 231629 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java clone,深度clone和shadow clone

 
阅读更多
http://blog.csdn.net/shootyou/article/details/3945221


现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的?
     1. Clone&Copy
     假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通
常我们会有这样的赋值Employee cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,这样cindyelf或者tobby的一个操作都可能影响到对方。打个比方,如果我们通过cindyelf.raiseSalary()方法改变了salary域的值,那么tobby通过getSalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候我们就可以使用Clone来满足我们的需求。Employee cindy=tobby.clone(),这时会生成一个新的Employee对象,并且和tobby具有相同的属性值和方法。
      2. Shallow Clone&Deep Clone
Clone是如何完成的呢?Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。这样,问题就来了咯,以Employee为例,它里面有一个域hireDay不是基本型别的变量,而是一个reference变量,经过Clone之后就会产生一个新的Date型别的reference,它和原始对象中对应的域指向同一个Date对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的,过程下图所示:



这个时候我们就需要进行deep Clone了,对那些非基本型别的域进行特殊的处理,例如本例中的hireDay。我们可以重新定义Clone方法,对hireDay做特殊处理,如下代码所示:
[java] view plaincopyprint?
   class Employee implements Cloneable 
 

        public Object clone() throws CloneNotSupportedException 
        { 
         Employee cloned = (Employee) super.clone(); 
      cloned.hireDay = (Date) hireDay.clone() 
      return cloned; 
        } 


3. Clone()方法的保护机制

在Object中Clone()是被申明为protected的,这样做是有一定的道理的,以Employee

类为例,通过申明为protected,就可以保证只有Employee类里面才能“克隆”Employee对象,原理可以参考我前面关于public、protected、private的学习笔记。

4. Clone()方法的使用

Clone()方法的使用比较简单,注意如下几点即可:

a. 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable

b. 调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException
  • 大小: 21.7 KB
分享到:
评论

相关推荐

    java Clone

    `clone`方法分为两种类型:浅克隆(Shadow Clone)和深克隆(Deep Clone)。浅克隆是指只复制对象本身,而不复制其引用的对象。如果对象中包含其他对象的引用,那么这些引用的对象不会被复制,而是共享同一份引用。...

    git-shadow-alias:此 bash 脚本可帮助您在同一文件夹中维护多仓库

    git-shadow-repos 这个 bash 脚本可以在同一个 git 目录中管理多个 ...从远程仓库恢复项目 git clone <url>cd <target>git shadow clone <git> <shadow>用法 Install: ./git-shadow install Usage: git shadow [shadow

    calpis-clone-2021:calpis-clone-2021更新

    此外,CSS3还引入了过渡(transition)、动画(animation)和阴影(box-shadow、text-shadow)等效果,让网页更具动态感和深度。 在calpis-clone-2021项目中,我们还可以期待看到CSS预处理器(如Sass、Less)的应用...

    kokoa-clone-2021:Kokoa Clone 2021更新

    CSS3则带来了许多视觉上的革新,如阴影效果(box-shadow)、渐变(gradient)、边框半径(border-radius)以及过渡(transition)和动画(animation)。这些特性使得网页设计更加生动和吸引人。CSS3还引入了媒体查询...

    make-or-break:演示项目,用于讨论 Java 代码对 CPU 级别的影响

    安装和使用 如果未安装 Gradle: git clone https://github.com/danielmitterdorfer/make-or-break.git cd make-or-break ./gradlew shadow java -jar build/libs/make-or-break-0.1.0-all.jar 或者,如果安装了 ...

    shadow_removal

    shadow_removal 照常登录到hpc并导航到$ HOME / ece569目录$ cd ~/ece569 注意:这应该与您的实验室和build_dir所在的位置相同克隆仓库$ git clone https://github.com/mbarmstrong/shadow_removal.git 导航到build_...

    ShadowNode:在最终设备中使用Node.js(QQ:796448809)

    影子节点影子中的Node.js运行时可在边缘设备上启用N-API和庞大的Node.js程序包。...文献资料建立获取源代码$ git clone https://github.com/yodaos-project/ShadowNode.git$ cd ShadowNode建立Shadow

    shadow.js:基于刚体模拟和阴影映射的 WebGL 演示

    这是一个基于刚体模拟和阴影映射的WebGL演示。 (尝试使用支持 WebGL 的浏览器) 快速开始 克隆这个 repo, git clone git://github.com/e-eq-mc2/shadow.js.git或git clone ...

    box-shadow-generator:快速,轻松地生成超赞CSS Box Shadow

    盒子阴影发生器 快速,轻松地生成超赞CSS Box Shadow 这是一个可以帮助前端Web开发人员生成满足其需求的最佳阴影效果的工具。... git clone https://github.com/martinthampi/box-shadow-generator.git cd box-sha

    shadow-cljs + tailwindcss-jit-JavaScript开发

    tailwindcss-jit这是如何设置shadow-cljs和使用tailwindcss-jit的示例开发git clone https://github.com/jaceksc shadow-cljs + tailwindcss-jit这是如何设置的示例shadow-cljs和使用tailwindcss-jit开发git clone ...

    js+css炫酷3d立体卡通文字特效

    这个特效是通过动态克隆文本内容并应用特定的CSS样式,包括text-shadow属性和transform属性,来创造逼真的3D视觉效果。由于涉及到的主要技术是JavaScript和CSS3,因此我们也会讲解这两个领域的基础知识以及它们在...

    shadow-cljs-tailwindcss:shadow-cljs + tailwindcss-jit

    git clone https://github.com/jacekschae/shadow-cljs-tailwindcss.git app cd app npm install npm run dev 这将运行shadow-cljs服务器进程和postcss 。 它将在dev中观察cljs-runtime/*.js文件,并将使用main.js...

    shadow-re-frame:带重新框架,重新框架跟踪的shadow-cljs示例

    git clone https://github.com/mhuebert/shadow-re-frame.git ; cd shadow-re-frame; npm install; npm run watch; 然后,打开浏览器窗口到 。 按Control-H键可查看重新帧跟踪面板。 现在您应该看到:

    shadow-ui:具有100多个Web组件的UI模式库,自动屏幕截图测试以及带有Storybook的MDX文档

    :package: @ shadow-ui 该项目是由Lit Element构建的100多个健壮和现代Web组件的精选集合。 ...这些说明将为您提供在本地计算机上运行...git clone git@bitbucket.org:shadow-ui.git cd packages/eslint-co

    ApplicationInsights-Java:适用于Java的Application Insights SDK

    如果您需要在本地构建下载主仓库和子模块: git clone https://github.com/microsoft/ApplicationInsights-Javacd ApplicationInsights-Javagit submodule initgit submodule update将所有子项目从子模块发布到本地...

    Shadow-Engine:77Z的游戏引擎

    影子引擎 游戏引擎! 目录 跑 为了在您的计算机上运行Shadow Engine,您需要执行以下操作: Windows 10机器 $ git clone -- depth = 30 ... Shadow无法运行的最常见原因是node-pty和robotjs,它们都

    Android代码-FridaAndroidTracer

    Grab the prebuilt shadow jar (FridaAndroidTracer.jar) inside the repo, or clone the repo, open in IntelliJ IDEA. Usage usage: java -jar FridaAndroidTracer.jar -a,--expand-array expand array values -...

    react-shadow-scroll:自定义列表并在存在滚动时插入阴影的组件

    git clone https://github.com/andrelmlins/react-shadow-scroll.git cd react-shadow-scroll npm install && npm run start 例子 import React from 'react' ; import { render } from 'react-dom' ; import ...

    shadow-re-frame-simple-example

    运行示例git clone git@github.com:quangv/shadow-re-frame-simple-example.gitcd shadow-re-frame-simple-exampleyarn ; or npm installnpx shadow-cljs server 这将运行shadow-cljs服务器进程,以下所有命令将...

    kakao-clone-v2.0:这是一个 KakaoTalk 克隆项目。

    kakao-clone-v2.0 一、简介 这是我在观看 KakaoTalk 克隆编码讲座后制作的一个项目。 2. 使用的技术 HTML、CSS 3. 学习回顾 您已经学习了如何构建 ... 我们研究了如何利用 CSS flex、animation 和 box-shadow。 视频

Global site tag (gtag.js) - Google Analytics