java克隆详述-Java基础-Java-编程开发

java进阶 对象克隆—对象复制将一个已经存在的对象以及对象数据克隆到另一个对象中,类实现Cloneable接口 重写Object 类中clone(),在重写的clone方法中,调用父类clone方法返回一个对象浅克隆:克隆一个对象时,如果对象中有关联的对象,只将关联对象的地址复制过来。深克隆:克隆一个对象时,如果对象中有关联的对象,将关联的对象也一块克隆(创建一个新的)。如何做到深克隆:在每一层中都重写clone方法,类实现Coneable接口,层级多了就比较麻烦序列化方式:对象输入和输出流。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

经常听到有人说java中没有指针。事实如此吗?no,java是有指针的,只不过换了个名字而已,也就是我们经常提到的引用。我们知道,在java中一切都是对象,那么我们如何操控对象?如何在成千上万的对象中找到我们所需的那个对象呢?又是如何让对象按照我们的意思来完成任务的呢?

Objecto=newObject();

这是java中最常见的语句了,在这句话中做了三件事。首先声明一个Object类型的变量o,在内存中为对象划分一块地址newObject(),将声明的变量指向内存中的对象。如此一来,我们就可以通过o来操纵对象了。就好像孩子们玩的遥控飞机,在空中飞行的是飞机,而使它做出优美动作的却是孩子们手中的摇控器。

"克隆"是如今听到的较多的词汇,听说已经将某只羊克隆了好几份了。但愿这种技术不要在人身上实验。java中也有"克隆",与现实世界的克隆一样,将一个实际存在的对象拷贝几份。如下:

//倒霉的羊
publicclassSheepimplementsCloneable{
privateStringname;
publicvoidsetName(Stringarg){
name=arg;
}
publicStringgetName(){
returnname;
}
publicObjectclone()throwsCloneNotSupportedException{
returnsuper.clone();
}
}
//克隆
publicclassMain{
publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{
Sheepsheep=newSheep();//先得到那只羊的实例
sheep.setName("我是真的");//给它做个记号
System.out.println("sheep.getName()=" sheep.getName());
SheepsheepClone=(Sheep)sheep.clone();//开始克隆
System.out.println("sheepClone.getName()=" sheepClone.getName());
}
}

运行程序结果为:

sheep.getName()=我是真的
sheepClone.getName()=我是真的

两只羊是一模一样的(哪怕那只羊瘸腿)。让我们来看看代码。首先要注意的是Sheep类实现了Cloneable接口(该接口属于java.lang包,默认已经导入了),该接口中并没有定义要实现的方法,是个空接口,起标志作用。也就是说,实现了这个接口的羊就不再是只普通的羊,它是一只可以被克隆的羊。再往下看,有个clone方法,返回Object类型的对象,并抛出CloneNotSupportedException异常。该方法覆写了父类(Object)的clone方法,并在最后调用了super.clone(),这也意味着无论clone类继承结构是什么样的,super.clone()都会直接或间接调用Object类的clone()方法。看看jdk帮助文档会发现,Object类的clone()是一个native方法,我们知道,native方法的效率一般来说都是远高于java中的非native方法。这也说明了new一个对象,然后将原对象中的数据导入到新创建的对象中去的做法是多么愚蠢。必须说明的是Object中的clone方法是protected的,所以要使用clone就必须继承Object类(默认)。并且为了可以使其它类调用该方法,必须将其作用域设置为public。

以上只是一个简单clone的实现。明天说说"影子clone"和"深度clone"。

夜,深了。

[1] [2]

题133. 克隆图 Java /* // Definition for a Node. class Node { public int val; public List<Node> neighbors; public Node() {} public Node(int _val,List<Node> _neighbors) { val = _val; neighbors = _neig... 阅读详情

相关推荐

Java 中使用 Gson 实现深度克隆 #什么是深克隆与浅克隆?#clone方法为什么不能直接通过某个对象实例在外部类调用?

在 Java 编程中,克隆对象是一项常见的需求,特别是在处理不可变对象、避免引用传递时,深度克隆显得尤为重要。虽然 Java 提供了 clone() 方法,但由于它的限制(如 Cloneable 接口的复杂性),实际项目中并不常用。为此,许多开发者选择使用第三方工具来实现深度克隆,其中,Gson 是一个非常流行且简洁的解决方案。

q251932440的博客 1845

编程自学指南:java程序设计开发,Java 克隆对象浅拷贝、深拷贝,什么是克隆对象,为什么需要克隆对象,Java 中的克隆机制

编程自学指南:java程序设计开发,Java 克隆对象浅拷贝、深拷贝,什么是克隆对象,为什么需要克隆对象,Java 中的克隆机制

zl515035644的博客 716

U-Boot 适配新型号 SPI Nor Flash 实战解析

本文详细解析了U-Boot适配新型号SPI Nor Flash的全过程,从JEDEC ID识别错误入手,深入源码分析Flash信息数据库,结合实际手册参数添加新设备支持。重点介绍了设备树同步和验证调试的关键步骤,并总结了常见问题与解决方案,为嵌入式开发者提供实用参考。

weixin_29170327的博客 202

[Java]常用排序遍历克隆

import java.util.*; public class test { public static void main(String[] args) { System.out.print(""); //TreeMap(Key)逆序排列================================================== ...

凉月的博客 227

oracle ebs form 10g安装教程

这个窗口需要想想,你要安装的类型,不要盲目点击“下一步”,因为一旦Oracle安装后,重新安装之前,需要卸载Oracle干净才能重新安装,有时还会出现错误。到了该窗口后,需要耐心等待安装,安装到一大半后,自动弹出一个窗口,让我们选择Oracle安装第2部分磁盘的路径,继续安装,然后坐等安装结束。自定义安装Oracle根目录,点击“下一步”按钮后,耐心等待几秒钟,工具自动加载产品列表,加载完后,自动跳转到“选择安装类型”窗口。注:等待几秒钟后,关闭dos窗口,不必惊慌,自动调转到安装界面。

XIELIUHAI001的博客 475

数字后端设计实现 | 数字后端PR工具Innovus中如何创建不同高度的row?

数字IC后端设计实现之innovus中如何创建不同高度的row?

weixin_37584728的博客 3164

java list 深度克隆

public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out..

b_just的博客 753

【Pico手势开发实战】基于SteamVR串流与MRTK3的跨平台交互方案

本文详细介绍了在Pico设备上,结合SteamVR串流与微软MRTK3框架,实现高效跨平台手势交互开发的完整方案。该方案通过在PC端运行Unity项目并串流至头显,利用MRTK3封装的手势识别与交互组件,大幅提升了开发调试效率与性能上限,并确保了未来向其他OpenXR设备的良好兼容性。

weixin_29001683的博客 218

如何实现对象克隆

实现深克隆也可以通过第三方工具进行深克隆 gson。

XF的博客 129

全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

​【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 wifi模块,之前测试的时候,开发板上用的是esp8089,当时内核时4.14.y,测试也是通过的。链接地址在这里, https://blog.youkuaiyun.com/feixiaoxing/article/details/131178420?spm=1001.2014.3001.5501 那个时候测试的时候,我们就说过,wifi驱动可能是除了镜像制作之外,最复杂的一个

嵌入式-老费,一个分享专业嵌入式知识的blog 1160

帝企鹅优化器(EPO)详解:从基础原理到代码实战

帝企鹅优化器(EPO)是受帝企鹅群体在极寒环境中抱团取暖行为启发,于2018年提出的一种群体智能优化算法。其核心机制是模拟帝企鹅种群通过动态调整位置来维持体温的过程,主要包括确定集群边界、计算温度分布、衡量个体间距离以及更新位置四个步骤,从而在求解复杂优化问题时有效平衡全局探索与局部开发。该算法具有参数少、结构清晰、易于实现等优点,在工程优化、图像处理、机器学习特征选择以及冷链物流车辆路径规划等领域展现出良好的应用潜力。

qq_42212808的博客 141

java202303java学习笔记第二十六天-浅克隆和深克隆和对象工具类3

java

qq_41632427的博客 100

Sigrity SystemSI仿真分析教程文件路径

为了方便读者能够快速上手和学会Sigrity SystemSI 的功能,将Sigrity SystemSI仿真分析教程专栏所有文章对应的实例文件上传至以下路径。

weixin_54787054的博客 714

java202303java学习笔记第二十六天-浅克隆和深克隆和对象工具类2

java

qq_41632427的博客 75

基于STM32设计的指纹考勤机_348

随着信息化管理需求的日益增长,传统的人工考勤方式已难以满足现代社会对高效、精准和安全的考勤管理要求。为解决这一问题,本项目设计并实现了一款基于STM32的指纹考勤机系统。该系统采用AS608指纹识别模块进行人员身份识别,ESP8266无线模块实现与上位机APP的通信,支持人员信息录入、考勤时间段设置、考勤记录保存与查询等功能。系统通过SQLite数据库存储考勤数据,并提供导出EXCEL表格功能,方便数据管理与统计分析。该系统具有高效的考勤管理能力和良好的用户交互体验,能够广泛应用于企业、学校等机构的考勤管理

526

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

编程自学指南:java程序设计开发,Java 对象创建的6种方式,从new到反射:Java 对象创建全解析,new关键字,反射机制,克隆(Clone),反序列化 ,工厂模式,建造者模式

编程自学指南:java程序设计开发,Java 对象创建的6种方式,从new到反射:Java 对象创建全解析,new关键字,反射机制,克隆(Clone),反序列化 ,工厂模式,建造者模式

zl515035644的博客 1992

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java开发程序员必知的Java编程的10种错误

<br /><br />作为程序员在程序开发的过程中难免的要出现一些不是自己水平问题二出现的一些常见的错误。本文就为大家介绍一些常见在Java开发过程中遇见的一些常见的错误。<br />一、常见错误1:多次拷贝字符串<br />测试所不能发现的一个错误是生成不可变(immutable)对象的多份拷贝。不可变对象是不可改变的,因此不需要拷贝它。最常用的不可变对象是String。<br />如果你必须改变一个String对象的内容,你应该使用StringBuffer。下面的代码会正常工作:String s = 

Eterno的专栏 1063

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

day18-API(常见API,对象克隆)

tips:了解内容查看API文档,我们可以看到API文档中关于System类的定义如下:System类所在包为java.lang包,因此在使用的时候不需要进行导包。并且System类被final修饰了,因此该类是不能被继承的。System包含了系统操作的一些常用的方法。比如获取当前时间所对应的毫秒值,再比如终止当前JVM等等。要想使用System类我们就需要先创建该类的对象,那么创建对象就需要借助于构造方法。

2301_76979886的博客 1107

java基础面试题

Java 面试题 基础: JDK 和 JRE 的区别 == 和 equals 的区别 基本类型和包装类对象使用 == 和 equals进行比较的结果? 什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题? hashCode()相同,equals() 也一定为 true吗? final 在 java 中的作用 final finally finalize()区别 finally语句块一定执行...

爱笑的冷眸 151

Java编程中十大最糟糕的事情

Java编程中十大最糟糕的事情 Java已经成为最受欢迎和语言与平台之一,但是在实际编程中有不少坑,了解了这些坑,你还敢说精通Java,如果它们是面试题,你能得几分?当然你也可以把这些坑看成是在坑黑Java: 1. Weak Soft和Phantom等软引用是邪恶的,它们会导致不可预期奇怪的Bug,使用这些引用导致你的程序运行时的行为就会依赖GC垃圾回收机制,因为 GC是自行根据情

明风的博客 854

【5】Java基础41-50

目录 知识点41:什么是 java 序列化?什么情况下需要序列化? 知识点42:动态代理是什么?有哪些应用? 知识点43:怎么实现动态代理? 知识点44:为什么要使用克隆? 知识点45:如何实现对象克隆? 知识点46:深拷贝和浅拷贝区别是什么? 知识点47:http 响应码 301 和 302 代表的是什么?有什么区别? 知识点48:forward 和 redirect 的区别? ...

19年的努力,并不是说说而已! 12万+

Java常用类库01:Java基础类库+数字操作类+日期操作类

Java高级编程:Java常用类库 目录标题Java高级编程:Java常用类库一、Java基础类库StringBuffer类CharSequence接口AutoCloseable接口Runtime类System类Cleaner类对象克隆二、数字操作类Math数学计算类Random随机数生成类大数字处理类三、日期操作类Date日期处理类SimpleDateFormat日期处理 一、Java基础类库 StringBuffer类 String类是在所有项目开发之中一定会使用到的一个功能类,并且这个类拥有如下的特点

耿鬼不会笑的博客 526

JAVA SE 基础篇 L9-L10

文章目录L91 基础工具类(1) String类(2) StringBuffer类 和 StringBuilder类(3) Scanner类(4) 日历类--Calendar2 数组(1) 一维数组(2) 数组的clone()方法与浅克隆(3) 二维数组L101 泛型相关(1) 基本类型的封装类--自动装箱和拆箱(2) 泛型初步2 进阶工具类(1) 浅谈ArrayList 和 LinkedList(2) ArrayList和LinkedList的使用(3) ArrayList和LinkedList的特点(4

weixin_43541094的博客 296

java语言中解决一些安全问题的技巧(安全编程非常重要标签)

对付高严重性暴露的技巧 请遵循下列建议以避免高严重性静态安全性暴露: 限制对变量的访问 让每个类和方法都成为 final,除非有足够的理由不这样做 不要依赖包作用域 使类不可克隆 使类不可序列化 使类不可逆序列化 避免硬编码敏感数据 查找恶意代码 限制对变量的访问 如果将变量声明为 public,那么外部代码就可以操作该变量。这可能会导致安全性暴露。

薛秋艳的博客 745

Java 编程问题(一)

JDK 在版本 8 和版本 12 之间的超快发展增加了现代 Java 的学习曲线,因此增加了将开发人员置于生产力平台所需的时间。它的新特性和新概念可以用来解决各种现代问题。这本书使您能够通过解释有关复杂性、性能、可读性等方面的正确实践和决策,对常见问题采取客观的方法。《Java 编程问题》将帮助您完成日常任务并在截止日期前完成。本书中包含 1000 多个示例的 300 多个应用涵盖了共同和基本的兴趣领域:字符串、数字、数组、集合、数据结构、日期和时间、不变性、类型推断、、Java I/O、Java 反射、函

龙哥盟 407

浅克隆以及深克隆到底什么意思

一、这个克隆真的是克隆而已吗? 没错,就是你想像的克隆一个对象,依据已经有的数据,创造一份新的完全一样的数据拷贝 二、他们有什么区别吗? 一、两大区别,浅克隆和深克隆 浅克隆:是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象,也就是说对象虽然克隆出来了,但是引用的对象还是那个。 深克隆:不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。 四、克隆有什么作用? 看一下下面这段代码 public static void main(String[] arg

TwelveT的博客 1697
上一篇: Java数字签名-Java基础-Java-编程开发
下一篇: Java语言中链表和双向链表的实现-Java基础-Java-编程开发
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值