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类对象,调用 ...
随机推荐
- Delphi ADOQuery连接数据库的查询、插入、删除、修改
http://blog.csdn.net/chinazhd/article/details/45047777 //查询记录 procedure TForm1.Button1Click(Sender: ...
- random 函数
Random()在Delphi中,有一随机函数,是这样定义的:function Random [ ( Range: Integer) ]; 其中,参数Range为一整数,该函数返回值也为整数,其范围为 ...
- Python collections.defaultdict() 与 dict的使用和区别
看样子这个文档是难以看懂了.直接看示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import collections s = [('yellow', ...
- c# 正则表达式的用户
Regex emailregex = new Regex("(?<user>[^@]+)@(?<host>.+)"); if(emailregex.IsMa ...
- django QuerySet里那些常用又不常见的技巧
QuerySet 像Entry.Objects.all(),这些操作返回的是一个QuerySet对象,这个对象比较特别,并不是执行Objects.all(),或者filter之后就会与数据库交互,具体 ...
- iOS 开发新版 动态库framework
0. 参考 http://www.cocoachina.com/industry/20140613/8810.html framework+xib参考 : http://blog.csdn.net/x ...
- iOS 之 Strong与Weak,_unsafe _unretained与weak区别
1. 在ARC中 strong(强引用) 相当于retain, weak(弱引用) 相当于assign.ARC下,strong告诉编译器自动插入retain.但是在ARC下,代理协议的属性依然用ass ...
- Java经典案例之-“统计英文字母、空格、数字和其它字符的个数”
/** * 描述:输入一行字符串,并且统计出其中英文字母.空格.数字和其它字符的个数. * 分析:利用for语句,条件为输入的字符不为 '\n ' * 作者:徐守威 */ package com.xu ...
- PHP5中PDO的入门教程
PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 5.5中,更是强烈推荐使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_my ...
- origin中把多个拟合曲线放在一张图
双击其中一个.或者New一个graph.这里直接双击其中一个图. 右键,找到layer contents. 可以看到,一个scatter配一个polynomial fit line.把剩下的B,C,D ...