• 拷贝构造函数,经常被称作X(X&),是一种特殊的构造函数,他由编译器调用来完成一些基于同一类的其他对象的构件及初始化。它的唯一的一个参数(对象的引用)是不可变的(因为是const型的)。
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
Java的clone()方法
⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
⑵Java中对象的克隆
①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
②在派生类中覆盖基类的clone()方法,并声明为public。
③在派生类的clone()方法中,调用super.clone()。
④在派生类中实现Cloneable接口。
请看如下代码:
  1. class Student implements Cloneable
  2. {
  3. String name;
  4. int age;
  5. Student(String name,int age)
  6. {
  7. this.name=name;
  8. this.age=age;
  9. }
  10. public Object clone()
  11. {
  12. Object o=null;
  13. try
  14. {
  15. o=(Student)super.clone();//Object中的clone()识别出你要复制的是哪一
  16. // 个对象。
  17. }
  18. catch(CloneNotSupportedException e)
  19. {
  20. System.out.println(e.toString());
  21. }
  22. return o;
  23. }
  24. }
  25. public static void main(String[] args)
  26. {
  27. Student s1=new Student("zhangsan",18);
  28. Student s2=(Student)s1.clone();
  29. s2.name="lisi";
  30. s2.age=20;
  31. System.out.println("name="+s1.name+","+"age="+s1.age);//修改学生2后,不影响
  32. //学生1的值。
  33. }
说明:
①为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的 clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。

转载于:https://blog.51cto.com/2153340/534814

Java技巧:深拷贝的两种方式(转)相关推荐

  1. java List深拷贝的两种方式

    大家都知道java里面分为浅拷贝和深拷贝.举个简单的例子,区分一下浅拷贝和深拷贝的区别 public class Address{private String address;public Addre ...

  2. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  3. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  4. Java 实现抽奖的两种方式

    Java实现抽奖的两种方式 方式一:随机数在哪个区间内返回区间下标 方式二:随机数加入区间点集合排序返回随机数下标 代码示例: ①抽奖入参类型为BigDecimal: package com.cfay ...

  5. Java格式化倒计时的两种方式

    Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...

  6. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  7. java 产生随机数的两种方式,Java产生随机数的两种方式

    Java产生随机数的两种方式 Java产生随机数的两种方式 在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.M ...

  8. Java读取证书的两种方式

    关于证书基础以及创建.查看.删除.导入.导出以及其他功能详解请参照:Java使用keytool创建CA证书 Java读取证书有两种方式 1.从文件中读取 public static void main ...

  9. 创建和应用Java包文件的两种方式

    <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package       包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...

  10. java文件读写的两种方式

    今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOExceptio ...

最新文章

  1. Jzoj4729 道路修建
  2. aMCMC for Horseshoe: algorithms
  3. Delphi编译指令说明
  4. Linux 每日一练 :cat猫 的 反义词是啥 ? 是这个tac 哇哇哇!!
  5. 从远程服务器中下载文件到本地
  6. 基于SpringBoot的社区物业管理系统(设计与实现详解)
  7. Abaqus DOC 搜索功能 在 IE浏览器 显示“应用程序已被JAVA安全阻止”解决办法
  8. 启动tomcat8时出现springfox.documentation.spi.service.contexts.OperationContext.headers()Ljava/util/Set;错误
  9. 利用简单电阻分压原理自动测量电阻
  10. 学习B站UP雨落弦鸣的《超简单效果超好的个人网站博客搭建(对小白很友好)》中遇到的问题
  11. 计算机摄影比赛,计算机系摄影大赛圆满结束
  12. 基于CNN卷积神经网络实现中文手写汉字识别
  13. 图机器学习-图神经网络
  14. FPGA驱动千兆以太网PHY但电脑只显示百兆
  15. linux篇---解决 Linux 系统,出现“不在sudoers文件中,此事将被报告”的问题
  16. 【编译原理】 三地址语句的具体实现
  17. 已解决FutureWarning: The default value of regex will change from True to False in a future version. In
  18. sql显示服务器连接不上,sql服务器连接不上
  19. 数组按照中文名称排序
  20. 黑马程序员_常见异常

热门文章

  1. mysql 设置域名_mysql 设置域名
  2. 能改变原生web前端元素样式的water.css
  3. 网站前端开发基础知识学什么?必备技能
  4. 森林怎么训练野人_138年前抓的“野人女孩”,最终命运如何?死前心愿让人心酸...
  5. jsx就是高级点的HTML拼接,JSX与HTML的那些不同
  6. 惠普光影精灵拆机换屏幕_聊聊惠普游戏本大军的“先遣部队”
  7. recyclerview不显示_Android studio中导入v7包,使用recyclerview前的操作
  8. 只保留日期_时间序列:日期范围、频率与偏移量
  9. STM8单片机低功耗---活跃停机(Active Halt)模式实现-1
  10. LUNA16_Challange数据预处理2