关于克隆

--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884817.html"谢谢--

1.假克隆
如:
ObjectA objA = new ObjectA();
ObjectB objB = objA;
(对于引用变量而言,使用"="将修改引用,而不是复制堆中的对象,
此时两个引用变量将指向同一个对象,因此,若是一个变量对其进行修改则会改变另外一个变量)
当修改objA时,objB也被修改,故称之为"假克隆"

2.浅克隆
当克隆对象时,需要使用clone()方法:
public Object clone() throws CloneNotSupportedException(默认情况下,该方法实现浅克隆)
由于该方法是受保护的方法,通常需要重写该方法并将访问权限改为public。
该方法将类中各个域进行复制,对于引用类型的域,这种操作会出现问题,故称之为"浅克隆"
提供克隆的类需要实现Cloneable接口,否则使用clone()方法时会抛出CloneNotSupportedException。
@Override
public ObjectA clone(){
ObjectA objA = null;
try{
objA = (ObjectA)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return objA;
}

注意:对于类中的域,如果只包含基本类型和不可变的引用类型,如String,或者对象在其生命周期内不会发生变化,则可以使用浅克隆来复制对象。
3.深克隆
当克隆对象时,需要使用clone()方法:
public Object clone() throws CloneNotSupportedException
(其中ObjectA类是ObjectB类中的一个属性)
@Override
public ObjectB clone(){
ObjectB objB = null;
try{
objB = (ObjectB)super.clone();
objB.objA = objA.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return objB;
}
注意:通常情况下,克隆对象时都需要使用深克隆。但是需要注意的是,如果引用类型中还有可变的引用类型域,
则该域也需要被进行克隆,如上面的ObjectA类如果增加一个X域,则该域也需要被克隆。

4.序列化实现深克隆
对于深克隆而言,如果有很多引用类型的域,那么重写clone()方法一次复制各个域是非常麻烦的,
如果引用类型的域也是由引用类型组成的,则应该考虑使用序列化的方式实现深克隆。
使用序列化写入完成再读出即可实现克隆,此种方法不用考虑引用类型的域,编写clone()方法相对简单,但是要求引用类型也实现Seralizable接口
(若是使用了API中的类且该类并没有实现Seralizable接口,则该域需要使用transient修饰)

ObjectB:
public class ObjectB implements Serializable{
……
@Override
public ObjectB clone(){
ObjectB objB = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try{
//将对象写入到字节数组中
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
oos.close();
}catch(IOException e){
e.printStackTrace();
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
try{
//从字节数组中读取对象
ObjectInputStream ois = new ObjectInputStream(bais);
objB = (ObjectB)ois.readObject();
ois,close();
}catch(IOException e){
e.printStackTrace();
}
return objB;
}
}

对于任何序列化对象,都要求实现Seralizable接口,若是域中有引用类型,则要求该引用类型也实现Seralizable接口。
(效率比直接克隆各个引用类型域慢)

总结:
如果类的各个域是基本类型或不可变类型,则可以使用浅克隆,否则使用深克隆
如果类的域比较复杂,可以使用序列化的方式实现,否则应该使用复制域的方式实现深克隆。

java笔记--关于克隆技术的更多相关文章

  1. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  2. JAVA数据库编程(JDBC技术)-入门笔记

    本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...

  3. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  4. Java实例 Part6:Java中的克隆

    目录 Part6:Java中的克隆 Example01:Java对象的假克隆 Example02:Java对象的浅克隆 Example03:Java对象的深克隆 Example04:序列化与对象克隆 ...

  5. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  6. Java中如何克隆集合——ArrayList和HashSet深拷贝

    编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...

  7. Java Web之JSP技术

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm ...

  8. Java Web之会话技术

    客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据J ...

  9. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:

随机推荐

  1. php mysqli扩展之预处理

    在前一篇 mysqli基础知识中谈到mysqli的安装及基础操作(主要是单条sql语句的查询操作),今天介绍的是mysqli中很重要的一个部分:预处理. 在mysqli操作中常常涉及到它的三个主要类: ...

  2. Fiddler工具的基本功能

    Fiddler是一款用于网页数据分析,抓取的工具,里面集成了对网页强大的功能外,还可以通过设置,使其对手机的数据也可以进行抓取 Fiddler的原理是: 通过在客户端和服务器之间创建一个代理服务器来对 ...

  3. requirejs的基本学习

    1.首先看几个简单的学习网站. http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 这里边有两个教程一个一,一个二,看完后你有简单的了解.

  4. vs操作快捷键

      注释:        先CTRL+K,然后CTRL+C取消注释: 先CTRL+K,然后CTRL+U 解析命名空间:shift+alt+f10   或Ctrl + .    调试快捷键 F6:   ...

  5. Pell方程及其一般形式

    一.Pell方程 形如x^2-dy^2=1的不定方程叫做Pell方程,其中d为正整数,则易得当d是完全平方数的时候这方程无正整数解,所以下面讨论d不是完全平方数的情况. 设Pell方程的最小正整数解为 ...

  6. PHP使用DateTime类做时间日期到字符串转换

    PHP关于时间日期的处理不是很规范,简单就简单了,就是不知道输入的字符串是否能够正确转化为需要的DateTime类型. 面向对象的PHP应该使用DateTime类来做string和dateTime的转 ...

  7. Bata版本冲刺计划及安排

    下一阶段需要改进完善的功能 UI: 1. 界面不够精细,布局不够美观并且尚有BUG没有解决,图形.色彩间不够协调. 2. 理清界面间的跳转逻辑. 搜索: 搜索成功并定位后,不会影响地理标签的显示. 定 ...

  8. java核心数据结构总结

    JDK提供了一组主要的数据结构的实现,如List.Set.Map等常用结构,这些结构都继承自java.util.collection接口. List接口 List有三种不同的实现,ArrayList和 ...

  9. nginx配置反向代理示例

    环境: nginx1:192.168.68.41 tomcat1:192.168.68.43 tomcat2:192.168.68.45 nginx安装网上很多教程,我是用yum安装的. 配置ngin ...

  10. xml_MathML的基本知识点__这东西要自己实践最好

    1 : <mi> 一般的字符串 2: <mo> 操作字符串 <mo> ( </mo> <mo>∑</mo> 3:<mn&g ...