1.浅复制与深复制概念 
浅复制(浅克隆) 
    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 
深复制(深克隆) 
    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

浅层克隆示例(实现Cloneable接口 并复写clone()方法即可)

public class Student implements Cloneable
{
  String name;
 int age;
  Student(String name,int age)
  {
  this.name=name;
  this.age=age;
  }
 public Object clone()
  {
   Object o=null;
  try
   {
   o=(Student)super.clone();//Object 中的clone()识别出你要复制的是哪一个对象。
   }
  catch(CloneNotSupportedException e)
   {
    System.out.println(e.toString());
   }
  return o;
  
  
 public static void main(String[] args)
  {
  Student s1=new Student("zhangsan",18);
  Student s2=(Student)s1.clone();
  s2.name="lisi";
  s2.age=20;
  //修改学生2后,不影响学生1的值。
  System.out.println("name="+s1.name+","+"age="+s1.age);
  System.out.println("name="+s2.name+","+"age="+s2.age);
 }
}
实现cloneable接口深层复制的实现示例
class Professor implements Cloneable
{
  String name;
  int age;
  Professor(String name,int age)
  {
  this.name=name;
  this.age=age;
  }
 public Object clone()
  {
   Object o=null;
  try
   {
    o=super.clone();
   }
  catch(CloneNotSupportedException e)
   {
    System.out.println(e.toString());
   }
  return o;
  }
}
public class Student implements Cloneable
{
  String name;
  int age;
  Professor p;
  Student(String name,int age,Professor p)
  {
  this.name=name;
  this.age=age;
  this.p=p;
  }
 public Object clone()
  {
   Student o=null;
  try
   {
    o=(Student)super.clone();
   }
  catch(CloneNotSupportedException e)
   {
    System.out.println(e.toString());
   }
   //对引用的对象也进行复制
   o.p=(Professor)p.clone();
  return o;
  
 public static void main(String[] args)
  {
  Professor p=new Professor("wangwu",50);
  Student s1=new Student("zhangsan",18,p);
  Student s2=(Student)s1.clone();
  s2.p.name="lisi";
  s2.p.age=30;
  //学生1的教授不 改变。
  System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
  System.out.println("name="+s2.p.name+","+"age="+s2.p.age);
 }
}
利用串行化来做深复制(复制的对象实现Serializable接口)
class Teacher implements Serializable{
  String name;
  int age;
  public void Teacher(String name,int age){
  this.name=name;
  this.age=age;
  }
}
public class Student implements Serializable{
 String name;//常量对象
 int age;
 Teacher t;//学生1和学生2的引用值都是一样的。
 public void Student(String name,int age,Teacher t){
  this.name=name;
  this.age=age;
  this.p=p;
 }
 public Object deepClone() throws IOException,
    OptionalDataException,ClassNotFoundException{//将对象写到流里
  ByteArrayOutoutStream bo=new ByteArrayOutputStream();
  ObjectOutputStream oo=new ObjectOutputStream(bo);
  oo.writeObject(this);//从流里读出来
  ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
  ObjectInputStream oi=new ObjectInputStream(bi);
  return(oi.readObject());
 }
 public static void main(String[] args){
  Teacher t=new Teacher("tangliang",30);
  Student s1=new Student("zhangsan",18,t);
  Student s2=(Student)s1.deepClone();
  s2.t.name="tony";
  s2.t.age=40;
  //学生1的老师不改变
  System.out.println("name="+s1.t.name+","+"age="+s1.t.age);
 }
}

转载于:https://www.cnblogs.com/FoxLegend/p/6392728.html

java中浅层克隆和深层克隆相关推荐

  1. python中复制、浅层拷贝、深层拷贝的区别

    python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...

  2. 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们

    浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...

  3. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  4. JAVA中浅复制与深复制

    來源:http://coolmist.javaeye.com/blog/127455 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引 ...

  5. 深度学习与神经网络关系(BP网络【浅层】与深层网络)

    文章目录 Deep Learning的基本思想 浅层学习(Shallow Learning)和深度学习(Deep Learning) 浅层学习是机器学习的第一次浪潮. 深度学习是机器学习的第二次浪潮. ...

  6. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  7. java中mapper层作用_Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper的内置方法model层就是实体类,对应数据库的表.controller层是Servlet,主要是负责业务模块流程的控制,调用service接口的方法,在struts2就是Action.Se ...

  8. JAVA中Action层, Service层 ,model层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.model层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  9. java中dao层命名规范_Dao层 · java开发规范 · 看云

    ##文件命名 >XXMapper.java 对应xml文件命名为XXMapper.xml ##文件 文件应与数据库中表一一对应,有特殊要求的可以一个表对应多个文件,但严禁一个业务一个文件 ##参 ...

最新文章

  1. Spring Data JPA 复杂/多条件组合分页查询
  2. 回调函数_实用程序类与函数式编程无关
  3. 2.0 自动梯度 - PyTorch学习笔记
  4. 程序员面试题精选100题(43)-n个骰子的点数[算法]
  5. quartus2管教锁定出不来_Quartus II 中常见Warning 原因及解决方法(转载)
  6. 分享下自己的EmpireofCode进攻策略 https://empireofcode.com/ https://empireofcode.com/game/#
  7. 软件工程 工具之二—— PowerDesigner v12(六)
  8. 10个用来处理键盘事件的JQuery插件和JS类库
  9. NOSL redis安装部署 lnmp+redis
  10. wpf treeview调整子菜单间距_完全由C编写,高度可移植,超级牛逼的菜单架构!...
  11. 函数的实参 函数的形参 闭包 js 1
  12. Docker加入裁员大军,关键时期Docker将何去何从?
  13. Android Activity类详解
  14. android 修改手机型号加点,修改Android设备信息,如修改手机型号为iPhone7黄金土豪版! -电脑资料...
  15. stm32f030移植到stm32f072
  16. 20190404 Informatic 学习一
  17. 微信公众号申请access_token报错appID无效
  18. qt实现视频播放器,基本功能都有,可以当毕设用
  19. Android Killer(反编译工具)技巧
  20. 最近爆火的电子血氧仪是什么原理?测的准吗?

热门文章

  1. 【文本分类】基于改进TF-IDF特征的中文文本分类系统
  2. 计算机应用基础统考操作,全国统考计算机应用基础操作题
  3. java 打开服务器excel文件_Java中上传excel文件并在服务器端读取存入数据库
  4. aba问题mysql_解决CAS机制中ABA问题的AtomicStampedReference详解
  5. linux 节点信,DOM 节点信息
  6. 昌邑机器人_上下料机器人昌邑机器人生产工厂
  7. android os被删除怎么办,手机系统应用误删了怎么办 如何修复手机异常【详细介绍】...
  8. python用动态规划求最短路径_动态规划之最短路径和
  9. tc写入txt成功却没有内容_挖洞经验 | 构造UserAgent请求头内容实现LFI到RCE提权
  10. 这款开源测试神器,圆了我玩游戏不用动手的梦想