JAVA浅层复制深层复制理解-java_01_20160824
在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相关推荐
- python深复制浅复制_Python复制–深层复制
python深复制浅复制 Today we will learn about Python copy class. We will also learn about shallow copy, dee ...
- js的深层克隆和浅层克隆代码和理解
<script> //判断是不是原始值 //判断是数组还是对象 //建立相应的数组或对象 var obj={name:'辣鸡',sex:'male',card:['laobi','feiw ...
- (1-2)神经网络与深度学习 | 浅层和深层神经网络
目录 浅层神经网络 神经网络的表示 计算神经网络的输出 单个样本前向传播 多个样本前向传播 激活函数 sigmoid函数与tanh函数 Relu函数和Leaky Relu函数 使用非线性激活函数原因 ...
- 图像检索研究进展:浅层、深层特征及特征融合
本文转自专知http://www.zhuanzhi.ai/document/7f7be4ead5b936eb91640a550c3506f4 方便自己学习 如有侵权 请联系删除 1 引言 随着计算机网 ...
- [转载] 深层复制构造函数和浅层复制构造函数区别
参考链接: Python复制(深层复制和浅层复制) 构造函数用来初始化对象的,复制构造函数是把一个已知的对象复制给新的对象,(2者都是对象). 浅复制构造函数只复制指针(换句话说就是2个对象的地址一样 ...
- 异常检测中的浅层模型与深度学习模型综述(A Unifying Review of Deep and Shallow Anomaly Detection)
A Unifying Review of Deep and Shallow Anomaly Detection 异常检测中的浅层模型与深度学习模型综述 摘要:随着众多异常检测方法(基于生成模型,单分类 ...
- J. Cheminform. | 基于化学基因组学中深度和浅层学习预测药物特异性
今天给大家介绍由巴黎文理研究大学计算生物研究中心的Veronique Stoven教授课题组发表在J Cheminform上的一篇文章.作者提出一种具有深度学习功能的化学基因组神经网络(CN),以分子 ...
- java对象复制_Java对象的深层复制与浅层复制
TestVO a = new TestVO(); a.setName("xiemingmei"); a.setBirthPlace("Hunan"); Test ...
- python中复制、浅层拷贝、深层拷贝的区别
python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...
最新文章
- CentOS7.4-btrfs管理及使用
- mysql如何实现实时存储_OpenResty + Mysql 实现日志实时存储
- Windows内核实验004 API调用
- C# window forms Treeview checkbox子节点和父节点相互选中的关系
- ASP.NET-后台cookie与前台JQUERY解析cookie
- 从软件工程看,语言只是工具
- shell脚本每日一练(一)
- 深度学习(四十)——深度强化学习(3)Deep Q-learning Network(2), DQN进化史
- 学习不一样的vue实战(1): 环境搭建
- 数据集:男女身高体重(二维)
- 这款扩音器让我见识了什么才是地摊神器,震撼的声音通透整条街
- 英语16种时态表和人称表
- 计算机简单构图,涨姿势了!人像二次构图技巧原来这么简单
- jQuery 案例-图片抽奖
- python递归函数例子_Python递归函数经典案例-汉诺塔问题
- 遇到问题---maven----Unable to process Jar entry
- 数据结构的一些基本术语概念-严蔚敏老师
- chroot jail
- Qt::Painter 详解
- C#第四章上机练习2