java中浅层克隆和深层克隆
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);
}
}
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);
}
}
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中浅层克隆和深层克隆相关推荐
- python中复制、浅层拷贝、深层拷贝的区别
python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...
- 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们
浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...
- java深度克隆_浅析Java中clone()方法浅克隆与深度克隆
现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...
- JAVA中浅复制与深复制
來源:http://coolmist.javaeye.com/blog/127455 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引 ...
- 深度学习与神经网络关系(BP网络【浅层】与深层网络)
文章目录 Deep Learning的基本思想 浅层学习(Shallow Learning)和深度学习(Deep Learning) 浅层学习是机器学习的第一次浪潮. 深度学习是机器学习的第二次浪潮. ...
- [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...
- java中mapper层作用_Java的MyBatis框架中Mapper映射配置的使用及原理解析
Mapper的内置方法model层就是实体类,对应数据库的表.controller层是Servlet,主要是负责业务模块流程的控制,调用service接口的方法,在struts2就是Action.Se ...
- JAVA中Action层, Service层 ,model层 和 Dao层的功能区分
首先这是现在最基本的分层方式,结合了SSH架构.model层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...
- java中dao层命名规范_Dao层 · java开发规范 · 看云
##文件命名 >XXMapper.java 对应xml文件命名为XXMapper.xml ##文件 文件应与数据库中表一一对应,有特殊要求的可以一个表对应多个文件,但严禁一个业务一个文件 ##参 ...
最新文章
- Spring Data JPA 复杂/多条件组合分页查询
- 回调函数_实用程序类与函数式编程无关
- 2.0 自动梯度 - PyTorch学习笔记
- 程序员面试题精选100题(43)-n个骰子的点数[算法]
- quartus2管教锁定出不来_Quartus II 中常见Warning 原因及解决方法(转载)
- 分享下自己的EmpireofCode进攻策略 https://empireofcode.com/ https://empireofcode.com/game/#
- 软件工程 工具之二—— PowerDesigner v12(六)
- 10个用来处理键盘事件的JQuery插件和JS类库
- NOSL redis安装部署 lnmp+redis
- wpf treeview调整子菜单间距_完全由C编写,高度可移植,超级牛逼的菜单架构!...
- 函数的实参 函数的形参 闭包 js 1
- Docker加入裁员大军,关键时期Docker将何去何从?
- Android Activity类详解
- android 修改手机型号加点,修改Android设备信息,如修改手机型号为iPhone7黄金土豪版! -电脑资料...
- stm32f030移植到stm32f072
- 20190404 Informatic 学习一
- 微信公众号申请access_token报错appID无效
- qt实现视频播放器,基本功能都有,可以当毕设用
- Android Killer(反编译工具)技巧
- 最近爆火的电子血氧仪是什么原理?测的准吗?
热门文章
- 【文本分类】基于改进TF-IDF特征的中文文本分类系统
- 计算机应用基础统考操作,全国统考计算机应用基础操作题
- java 打开服务器excel文件_Java中上传excel文件并在服务器端读取存入数据库
- aba问题mysql_解决CAS机制中ABA问题的AtomicStampedReference详解
- linux 节点信,DOM 节点信息
- 昌邑机器人_上下料机器人昌邑机器人生产工厂
- android os被删除怎么办,手机系统应用误删了怎么办 如何修复手机异常【详细介绍】...
- python用动态规划求最短路径_动态规划之最短路径和
- tc写入txt成功却没有内容_挖洞经验 | 构造UserAgent请求头内容实现LFI到RCE提权
- 这款开源测试神器,圆了我玩游戏不用动手的梦想