在java中,默认是浅层复制的,如果要复制的对象中只含有基本数据类型和String类型,

那么浅层复制和浅层复制是没有区别的,所以你可以放心的使用默认的浅层复制,

但是如果要复制的对象中除了上述类型还有数组和集合的话,浅层复制和深层复制是有区别的,有时候会出现意想不到的效果

实现浅层复制的方法:使你将来要复制的类实现Colneable接口,该接口中没有任何的方法,只是一个标示接口,

跟Serializable是一样的,由于你的类是继承Object类的,所以要在类里重写Clone方法

代码如下:
public class Student implements Cloneable{
 public int id;
 public String name;
 public int[] ids;
 public List list;
 public Student() {}
 public Student(int id,String name,int[] ids,List list){
  this.id=id;this.name=name;this.ids=ids;this.list=list;
 }
 public Object clone(){//该方法是Object类的Clone方法
  Object obj=null;
  try {
  obj= super.clone();
 } catch (CloneNotSupportedException e) {}//这个异常的意思是,如果要复制的类没有实现Cloneable,
//那么它是不支持复制的,所以前面实现该接口,就是为了标示此类可以被复制
  return obj;
 }
}
这样的话,如果我在:
 int[] ids = {2,3,4,5};
 Student s = new Student(1,"李戡",ids,list);
 Student s2 =(Student)s.clone();
 System.out.println(s2.id+","+s2.name+","+Arrays.toString(s2.ids));
 s2.ids[0]=100;
 System.out.println(Arrays.toString(s.ids));//[100,3,4,5]

此时,对象s中的数组也会变,同样对list进行类似操作也会得到相同结果,为什么呢?

这是因为浅层复制没有把新复制的对象和被复制对象隔离开,其在堆中引用的是一个数组,

所以,一个对象操作数组使得数组发生改变,

另一个对象也会改变(因为两者引用同一个数组),即新老对象没有完全隔离开

一般情况下,用浅层复制就够了,但是一些特殊情况下,必须使得新老对象完完全全的隔离开,

两者之间没有任何关系,那么就得使用深层复制了(deep clone)使用深层复制,

也得使被复制的类实现一个接口:Serializable,这个接口是序列化接口,要实现深层复制,只能用IO来解决了

代码如下:
 
public class Student implements java.io.Serializable{
  public int id;
  public String name;
  public int[] ids;
  public List list;
  public Test t;
  public Student() {}
  public Student(int id,String name,int[] ids,List list){
   this.id=id;this.name=name;this.ids=ids;this.list=list;
  }
}
然后使用ObjectInputStream,ObjectOutputStream的readObject,writeObject方法即可实现深层复制

JAVA浅层复制深层复制理解-java_01_20160824相关推荐

  1. python深复制浅复制_Python复制–深层复制

    python深复制浅复制 Today we will learn about Python copy class. We will also learn about shallow copy, dee ...

  2. js的深层克隆和浅层克隆代码和理解

    <script> //判断是不是原始值 //判断是数组还是对象 //建立相应的数组或对象 var obj={name:'辣鸡',sex:'male',card:['laobi','feiw ...

  3. (1-2)神经网络与深度学习 | 浅层和深层神经网络

    目录 浅层神经网络 神经网络的表示 计算神经网络的输出 单个样本前向传播 多个样本前向传播 激活函数 sigmoid函数与tanh函数 Relu函数和Leaky Relu函数 使用非线性激活函数原因 ...

  4. 图像检索研究进展:浅层、深层特征及特征融合

    本文转自专知http://www.zhuanzhi.ai/document/7f7be4ead5b936eb91640a550c3506f4 方便自己学习 如有侵权 请联系删除 1 引言 随着计算机网 ...

  5. [转载] 深层复制构造函数和浅层复制构造函数区别

    参考链接: Python复制(深层复制和浅层复制) 构造函数用来初始化对象的,复制构造函数是把一个已知的对象复制给新的对象,(2者都是对象). 浅复制构造函数只复制指针(换句话说就是2个对象的地址一样 ...

  6. 异常检测中的浅层模型与深度学习模型综述(A Unifying Review of Deep and Shallow Anomaly Detection)

    A Unifying Review of Deep and Shallow Anomaly Detection 异常检测中的浅层模型与深度学习模型综述 摘要:随着众多异常检测方法(基于生成模型,单分类 ...

  7. J. Cheminform. | 基于化学基因组学中深度和浅层学习预测药物特异性

    今天给大家介绍由巴黎文理研究大学计算生物研究中心的Veronique Stoven教授课题组发表在J Cheminform上的一篇文章.作者提出一种具有深度学习功能的化学基因组神经网络(CN),以分子 ...

  8. java对象复制_Java对象的深层复制与浅层复制

    TestVO a = new TestVO(); a.setName("xiemingmei"); a.setBirthPlace("Hunan"); Test ...

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

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

最新文章

  1. CentOS7.4-btrfs管理及使用
  2. mysql如何实现实时存储_OpenResty + Mysql 实现日志实时存储
  3. Windows内核实验004 API调用
  4. C# window forms Treeview checkbox子节点和父节点相互选中的关系
  5. ASP.NET-后台cookie与前台JQUERY解析cookie
  6. 从软件工程看,语言只是工具
  7. shell脚本每日一练(一)
  8. 深度学习(四十)——深度强化学习(3)Deep Q-learning Network(2), DQN进化史
  9. 学习不一样的vue实战(1): 环境搭建
  10. 数据集:男女身高体重(二维)
  11. 这款扩音器让我见识了什么才是地摊神器,震撼的声音通透整条街
  12. 英语16种时态表和人称表
  13. 计算机简单构图,涨姿势了!人像二次构图技巧原来这么简单
  14. jQuery 案例-图片抽奖
  15. python递归函数例子_Python递归函数经典案例-汉诺塔问题
  16. 遇到问题---maven----Unable to process Jar entry
  17. 数据结构的一些基本术语概念-严蔚敏老师
  18. chroot jail
  19. Qt::Painter 详解
  20. C#第四章上机练习2

热门文章

  1. tomcat server.xml详细配置
  2. Python基础----日期时间
  3. 机器学习解决问题思路 — 词嵌入矩阵E对于NLP问题的重要性
  4. c#利用SWIG调用c++dll学习总结【转】
  5. 移动国家号(MCC)
  6. 撸VUE弹窗组件 + 可编辑div 组件
  7. MySQL千万级访问量架构(转)
  8. Centos VIM 配置
  9. 诺基亚推出全新IMPACT平台,交付快捷安全的物联网服务
  10. 网络之NSURLConnection