- 浏览: 588125 次
- 来自: 北京
文章分类
最新评论
-
lidi2011:
很通俗易懂的文章,很形象。
同步synchronized方法和代码块 -
inuyasha027:
领教了,谢谢。
Hadoop安装, Hive 安装。 -
xbmujfly:
好文 ,本人发现晚了
学习笔记 - java.util.concurrent 多线程框架 -
hanazawakana:
学习学习!
ANT-build.xml文件详解 -
david.org:
似乎还忽略一点,那就是cassandra不同数据中心的同步,H ...
Cassandra Vs HBase
在JAVA中对象的克隆有的时候是必要的,克隆分两种:浅克隆、深克隆。
浅克隆 指如果对象中含有非基本类型的成员,那么克隆的对象与源对象共用该成员的引用,即在两个对象中该成员的引用是一样的。这种克隆是相对意义上的克隆,克隆的对象与源对象并没有绝对的独立。
深克隆
指克隆的对象与源对象在所有的成员上都有不同引用,实现了绝对意义上的克隆。浅克隆比起深克隆来很容易实现。下面先说浅克隆。
浅克隆的实现
:待克隆的类需实现java.lang.Cloneable接口,该接口无待实现的方法,只是一种标记。然后覆盖Object类的clone()方法,在方法中调用Object的clone()方法即可。
深 克隆的实现 :把此方法放到要克隆的对象中,并使被克隆的对象以及引用到的对象实现java.io.Serializable接口。
public Object clone() throws CloneNotSupportedException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(bos);
} catch (IOException e) {
e.printStackTrace();
}
try {
oos.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
// 将流序列化成对象
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bis);
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
try {
return ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
return null;
// return super.clone();
}
深克隆例子 :
package com.javaeye.xiaobian; import java.io.Serializable; public class Teacher implements Serializable { public int age; public String name; private Result result; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Result getResult() { return result; } public void setResult(Result result) { this.result = result; } }
package com.javaeye.xiaobian; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Student implements Cloneable, Serializable { public int age; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public Object clone() throws CloneNotSupportedException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(bos); } catch (IOException e) { e.printStackTrace(); } try { oos.writeObject(this); } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } // 将流序列化成对象 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = null; try { ois = new ObjectInputStream(bis); } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } try { return ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } return null; // return super.clone(); } }
package com.javaeye.xiaobian; import java.io.Serializable; public class Result implements Serializable { private long numeric = 100; public long getNumeric() { return numeric; } public void setNumeric(long numeric) { this.numeric = numeric; } package com.javaeye.xiaobian; public class Test { /** * @param args * @throws CloneNotSupportedException */ public static void main(String[] args) throws CloneNotSupportedException { // TODO Auto-generated method stub Result result = new Result(); result.setNumeric(101); Teacher teacher = new Teacher(); teacher.setAge(26); teacher.setName("xiaobian.iteye.com"); teacher.setResult(result); Object c; Student student = new Student(); student.setAge(20); student.setName("xiaobian.iteye.com"); student.setTeacher(teacher); Student student1 = (Student) student.clone(); // 克隆后未修改引用数据之前 System.out.println(student.getTeacher().getResult().getNumeric()); System.out.println(student1.getTeacher().getResult().getNumeric()); // 克隆后修改引用数据之后 student1.getTeacher().getResult().setNumeric(100); System.out.println(student.getTeacher().getResult().getNumeric()); System.out.println(student1.getTeacher().getResult().getNumeric()); } } }
测试输入出的结果:
101
101
101
100
浅克隆的例子 :
package com.javaeye.xiaobian; public class Student implements Cloneable { public int age; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public Object clone() throws CloneNotSupportedException { return super.clone(); } }
package com.javaeye.xiaobian; public class Teacher { public int age; public String name; private Result result; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Result getResult() { return result; } public void setResult(Result result) { this.result = result; } }
package com.javaeye.xiaobian; public class Result { private long numeric = 100; public long getNumeric() { return numeric; } public void setNumeric(long numeric) { this.numeric = numeric; } }
package com.javaeye.xiaobian; public class Test { /** * @param args * @throws CloneNotSupportedException */ public static void main(String[] args) throws CloneNotSupportedException { // TODO Auto-generated method stub Result result = new Result(); result.setNumeric(101); Teacher teacher = new Teacher(); teacher.setAge(26); teacher.setName("xiaobian.iteye.com"); teacher.setResult(result); Student student = new Student(); student.setAge(20); student.setName("xiaobian.iteye.com"); student.setTeacher(teacher); Student student1 = (Student) student.clone(); // 克隆后未修改引用数据之前 System.out.println(student.getTeacher().getResult().getNumeric()); System.out.println(student1.getTeacher().getResult().getNumeric()); // 克隆后修改引用数据之后 student1.getTeacher().getResult().setNumeric(100); System.out.println(student.getTeacher().getResult().getNumeric()); System.out.println(student1.getTeacher().getResult().getNumeric()); } }
测试结果:
101
101
100
100
发表评论
-
Cassandra Vs HBase
2011-03-31 17:27 2124Cassandra vs HBaseBy Vaibhav Pu ... -
Slope one:简单高效的推荐算法
2011-03-31 17:16 2710推荐系统最早在亚马逊的网站上应用,根据以往用户的购买行为, ... -
Hive 与 Hbase 的简单区别
2011-03-28 11:10 4168Hive是為簡化編寫MapReduce程序而生的,使用MapR ... -
Java对象缓存系统的实现,实现了LRU算法,并可以进行集群同步
2009-08-05 17:32 3706LRU算法实现: package com.javaeye.x ... -
Unsupported major.minor version 49.0
2009-07-14 16:03 1535http://www.blogjava.net/Unmi/ar ... -
Apache Commons Logging 是如何决定使用哪个日志实现类的
2009-07-14 16:01 1681http://www.blogjava.net/Unmi/ar ... -
Spring Quartz 任务调度
2009-07-07 10:22 2216要执行的任务类:CronTask pa ... -
利用java.util.concurrent包实现多线程开发
2009-06-23 16:09 2595有一个网站列表,我们分别使用单线程和多线程来测试这个网站是否允 ... -
Ngnix初探
2009-06-15 17:03 3211Nginx是什么? ... -
使用eclipse生成文档 javadoc
2009-06-15 10:20 14061,在项目列表中按右键,选择Export(导出),然后在Exp ... -
Java 日期类操作
2009-06-11 14:43 2293java之中操作日期的类分别为: #系统的日期时间类 ... -
留个记号。
2009-06-10 16:01 1020Comparable Comparator具体区别 h ... -
Java中java.io.Serializable接口的应用
2009-06-10 10:33 2543在Java中java.io.Serializable 用于实现 ... -
判断SQL注入的字符
2009-06-08 13:13 1440判断SQL注入的字符 public static bo ... -
ThreadLocal的设计与使用(原理篇)
2009-06-05 17:17 1085在jdk1.2推出时开始支持java.lang.ThreadL ... -
探索Java类加载机制
2009-06-05 10:34 1719java虚拟【java.dll】存在于JRE目中下的bin目录 ... -
Nagios介绍
2009-05-26 13:33 1678系统管理员如何能够监视大量的机器和服务以便提前解决问题防止人们 ... -
Memecached实现缓存系统搭建。
2009-05-25 17:51 28441.在windows系统或Linux系统上安装memecach ... -
Java动态代理实现。
2009-05-25 13:33 945HelloWorld.java 接口文件 public i ... -
Java回调函数的实现方式。
2009-05-14 15:13 1753接口Callback类 public interface ...
相关推荐
总结,Java中的对象克隆是一项重要的功能,用于复制和独立化对象。通过实现`Cloneable`接口和覆盖`clone()`方法,我们可以创建浅克隆对象。对于更复杂的场景,可以自定义克隆逻辑或利用序列化来实现深克隆。理解并...
在实际应用中,我们可能需要克隆对象以便于修改对象的状态而不影响原始对象的状态。例如,在某些情况下,我们可能需要将一个对象作为参数传递给一个方法,但是我们不想让方法修改原始对象的状态。在这种情况下,我们...
克隆主要用于创建对象的备份、实现复制功能或者在多线程环境中避免共享状态。Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅...
在实际应用中,克隆模式常用于数据备份、多线程环境下的对象复制,以及需要保持原有对象状态不变但又需要新对象的情况。例如,在游戏开发中,角色的复制可能就需要用到克隆模式;在数据库操作中,为了防止对原始数据...
Cloneable接口只是一个标记接口,用于标记实现该接口的类具有克隆功能。 在调用clone方法时,如果没有实现Cloneable接口,将会抛出CloneNotSupportedException异常。因此,在使用克隆机制时,需要确保实现了...
9. **国际化与本地化**:java.util.Locale和ResourceBundle类用于处理不同地区的语言和文化习惯,支持多语言环境的应用开发。 10. **XML处理**:DOM(Document Object Model)和SAX(Simple API for XML)是两种...
本文将深入探讨"深度克隆"这一概念,以及它与普通克隆的区别,并讨论其在实际应用中的优缺点。 深度克隆,也称为完全克隆,是一种创建新对象的技术,这个新对象不仅包含原始对象的所有属性值,还包含了嵌套对象的...
在Linux环境中编译GDAL(Geospatial Data Abstraction Library)并将其与Java环境集成是一项技术密集型的任务,涉及到多个步骤和依赖项...一旦完成,你就能在Java应用中充分利用GDAL的强大功能,处理各种地理空间数据。
本文将深入探讨Java中的引用以及对象的克隆机制,包括浅拷贝和深拷贝的区别及其应用场景。 #### 二、Java中的引用 在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下...
Java画图板小程序是一个基于Java编程语言开发的图形用户界面应用,它提供了丰富的绘图功能,如移动、复制和换色等,旨在为用户提供一个简单而直观的创作平台。这个程序的设计采用了MVC(Model-View-Controller)架构...
`opencv_454.jar`是Java接口的实现,它封装了OpenCV的C++接口,使得Java开发者可以方便地在Java程序中调用OpenCV的功能。而`libopencv_java454.dylib`是动态链接库文件,它是OpenCV的C++库的Java绑定,使得Java能够...
在Java中,`java.io.*`包中的流类如`BufferedReader`、`FileOutputStream`和`PrintWriter`等都是装饰器模式的具体应用。例如,`BufferedReader`就是在原始的输入流上添加缓冲功能,从而提高了读取效率。 #### 五、...
Java实现SVN,主要借助的是SVNKit框架,这是一款完全用Java编写的Subversion库,使得Java开发者能够轻松地在应用程序中集成版本控制系统Subversion的功能。本文将深入探讨如何使用SVNKit进行基础操作以及日志管理。 ...
在Java中,如果一个类想要实现克隆功能,必须实现`Cloneable`接口。这个接口没有定义任何方法,仅仅是一个标记接口。当一个对象实现了`Cloneable`接口,系统就知道这个对象是可克隆的。然而,仅仅实现`Cloneable`...
在Linux环境中,为了使用GDAL与Java应用程序交互,你需要编译GDAL的源代码,使其包含Java绑定。这里我们将详细探讨如何在Linux系统上编译GDAL 3.0.0版本,并使其适用于Java应用。 1. **环境准备**: 在开始编译...
### Java深度复制源代码知识点解析 ...综上所述,该Java深度复制工具类通过反射机制实现了JavaBean对象的深度复制,适用于多种场景下的对象复制需求,但在实际应用中需要注意性能和特殊对象结构的处理问题。
- **应用场景:** Java中实现计数功能的方法。 4. **Client (客户端):** - **定义:** 通常指与服务器通信的一端。 - **应用场景:** Java网络编程中客户端与服务器模型的应用。 5. **Code (代码):** - **定义:**...