clone方法的使用
转载自https://www.jianshu.com/p/ea8f7b1fbbb1
1. Cloneable的用途
Cloneable是标记型的接口,它们内部都没有方法和属性,实现 Cloneable来表示该对象能被克隆,能使用Object.clone()方法。如果没有实现 Cloneable的类对象调用clone()就会抛出CloneNotSupportedException。
2. 克隆的分类
-
浅克隆(shallow clone),浅克隆是指拷贝对象时仅仅copy对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
-
深克隆(deep clone),不仅copy对象本身,而且copy对象包含的引用指向的所有对象。
举例:对象X中包含对Y的引用,Y中包含对Z的引用。浅拷贝X得到X1,X1中依然包含对Y的引用,Y中依然包含对Z的引用。深拷贝则是对浅拷贝的递归,深拷贝X得到X1,X1中包含对Y1(Y的copy)的引用,Y1中包含对Z1(Z的copy)的引用。
3. 克隆代码举例
要让对象可以被克隆,应具备以下2个条件:
-
让该类实现java.lang.Cloneable接口;
-
重写(Override)Object的clone()方法;
具体写法是在重写clone方法时候,类调用父类的clone(),其中成员变量是引用对象的,调用自身的clone()方法,并将值set入类的clone对象内。
new 和clone区别
简单来说,new仅申请开辟内存,而后调用类的构造函数来初始化对象。clone也是先开辟内存,但不会调用构造函数来初始化,而是将源对象值复制给目标对象。若是深拷贝,则还需要一同拷贝源对象引用类型指向的内存,浅拷贝则只是拷贝引用本身。
使用场景:资源、性能优化场景,如上例中,当有大量消息需要处理时,减少硬件资源消耗非常重要,决定系统的并发吞吐量;一个对象多个修改者的场景,如一封邮件,我们需要同时发送给多个接收人,假如邮件系统不支持群发,我们需要对每一个接收人发送一封邮件,此时需要修改邮件接收地址,如果采用多线程发送,可以采用原型模式。
特点:父类继承cloneable,子类继承父类重写clone方法。通过cache对象使用子类,将子类存在一个map中作为成员变量,通过静态初始化方式初始化map。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现