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);
}
}
java中浅层克隆和深层克隆的更多相关文章
- java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)
java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配, ...
- JAVA中浅复制与深复制 - coolmist - ITeye技术网站
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- Java中Action层、Service层、Modle层和Dao层的功能区分
一.Java中Action层.Service层.Modle层和Dao层的功能区分: 首先,这是现在最基本的分层方式,结合了SSH架构. modle层就是对应的数据库表的实体类.(即domain) Da ...
- java数组对象的浅层复制与深层复制
实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.
- JAVA中浅复制与深复制
1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复 ...
- [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...
- JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操作,在这里可以编写自己需要的代码(比如简单的判断).Action层:引用对应的Servi ...
- java中dao层和service层的区别是什么?
首先解释面上意思,service是业务层,dao是数据访问层.呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用 ...
随机推荐
- php 三大特点:封装,继承,多态
一.封装 目的:让类更安全 做法:成员变量变为私有的,通过方法间接操作成员变量,在方法里面加限制条件 二.继承 概念:子类可以继承父类的一切 方法重写:在子类里面对父类进行方法重写 特点:单继承:一个 ...
- leetcode day4
[171]Excel Sheet Column Number Given a column title as appear in an Excel sheet, return its correspo ...
- JavaScript高级程序设计-8:BOM
1. 什么是BOM? BOM(Browser Object Mode) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的对象 ...
- js 匿名函数 json
<script type="text/javascript"> var My_func = function(name){ this.obj_name=name; ...
- sql语句:CASE WHEN END 的用法
select b,c, CASE a ' ' ' end from test1
- UVa 11456 - Trainsorting
题目大意:给一个车辆到达车站的序列(按时间先后),可以对车辆进行以下处理:插在队首.插在队尾或者拒绝进站.车站内的车辆必须按照重量大小从大到小排列,问车站内最多能有多少辆车辆? 假设车i是第一个进站, ...
- 用python实现模拟登录人人网
用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...
- ID3算法(Java实现)
数据存储文件:buycomputer.properties #数据个数 datanum=14 #属性及属性值 nodeAndAttribute=年龄:青/中/老,收入:高/中/低,学生:是/否,信誉: ...
- 启动子&外显子&内含子
启动子 http://baike.baidu.com/link?url=HMqaMY4mXusH--4hMu1p6P_XUzEve9lZhFGtxScnbb8Z9HaLYJ981eWxAuZt2iAP ...
- 使用布局(Layout资源)
实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...