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类对象,调用 ...
随机推荐
- 处理JSON格式的数据
JSON格式的数据是最常用的数据格式,处理方法的选择就显得比较重要了.我常用的一种是用对象来接收,然后保存在数组中,需要时直接从数组中取值.下面列出一个小例子. .h文件中: #import < ...
- CentOS根分区占满
我中奖了!!! 查看硬盘的使用情况(bjchenxu)df -k 以K为单位显示df -h 以人性化单位显示,可以是b,k,m,g,t.. 查看各目录占用大小 du -sh * du -ms /*
- 反射机制(实例化Class)对象
反,就是利用对象找到对象的出处 Object类中有一个方法,getClass() Date date = new Date(); System.out.println(date.getClass()) ...
- Html5 touch event
HTML5 for the Mobile Web: Touch Events POSTED BY RUADHAN - 15 AUG 2013 See also... Touch-friendly Dr ...
- osgEarth学习笔记(转载)
osgEarth学习笔记1. 通过earth文件创建图层时,可以指定多个影像数据源和多个高程数据源,数据源的顺序决定渲染顺序,在earth文件中处于最前的在渲染时处于最底层渲染:所以如果 ...
- Java线程:线程安全类和Callable与Future(有返回值的线程)
一.线程安全类 当一个类已经很好的同步以保护它的数据时,这个类就称为线程安全的.当一个集合是安全的,有两个线程在操作同一个集合对象,当第一个线程查询集合非空后,删除集合中所有元素的时候,第二个线程也来 ...
- jQuery DataTables and ASP.NET MVC Integration
part 1 : http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Pa ...
- context.Session[“xxx”]详解
1.在aspx和aspx.cs中,都是以Session[“xxx”]=”aaa”和aaa=Session[“xxx”].ToString()进行读写.而在ashx中,Session都要使用contex ...
- Spring集合配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://ww ...
- jQ小图标上下滑动特效
嗯,又到了,夜静饥寒的时候,手指颤抖,回望去,屋内满是寂静,寥寥绰影,咳咳咳,想我程序员之路还没到终点...就...咳咳咳 好了日常神经结束,还要涂我的唇膏.还剩下,最后一章,js动画(四),明天放上 ...