java的对象复制有两种方式:实现Serializable和实现Cloneable。
两者都能实现对象的复制,但是各有利弊:
1. 实现Cloneable必须实现clone()方法,clone方法复制对象非常简单,但是这样会对原始对象有侵入性,不利于对象的扩展:假设有一个新对象继承实现Cloneable的对象,那么新对象想要实现复制,就必须重写clone()方法。
2. 实现Serializable在复制对象时,方法相对复杂,需要使用ByteArrayOutputStream、ObjectOutputStream、ByteArrayInputStream、ObjectInputStream等类,但是无侵入性。
package com.sg.deepcopy;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* <b>DeepCopy.java</b>
* @author yanlei
* @version 1.0 Jun 9, 2012
*/
public class DeepCopy {
public static Object streamCopy(Object obj) throws IOException, ClassNotFoundException{
//初始化输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(out);
//将对象写入缓存
objOut.writeObject(obj);
objOut.flush();
objOut.close();
//初始化输入流
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream objIn = new ObjectInputStream(in);
//构造对象
return objIn.readObject();
}
public static CloneUser cloneCopy(CloneUser user) throws CloneNotSupportedException {
return (CloneUser) user.clone();
}
public static void main(String[] args) throws IOException, ClassNotFoundException, CloneNotSupportedException {
System.out.println("//使用字节流复制");
User user1 = new User("zhangsan");
System.out.println("user1的hash值" +user1);
User user2 = (User)streamCopy(user1);
System.out.println("user2的hash值" +user2);
System.out.println("//使用clone方法复制");
CloneUser cloneUser1 = new CloneUser("lisi");
System.out.println("cloneUser1的hash值" +cloneUser1);
CloneUser cloneUser2 = cloneCopy(cloneUser1);
System.out.println("cloneUser2的hash值" +cloneUser2);
}
}
class User implements Serializable{
public User(){}
public User(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class CloneUser implements Cloneable {
public CloneUser(){}
public CloneUser(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
分享到:
相关推荐
简单的将类继承和对象复制的细节进行简单的 描述以供大家一起学习。
本人查阅资料,以ppt的形式描述了iOS开发过程中可能困扰程序员的内存管理和对象复制等常见问题,以及iOS开发环境的升级带来的变化情况。 适合有入门基础的程序开发人员参考。
java对象复制.pdf
编程语言java对象复制.pdf
深度复制Java对象实例,复制后对象属性值改变不影响被复制对象,有注释
java对象复制[参考].pdf
《基于CORBA的容错对象复制算法》论文
model VO 值复制 注解 注解实现相同对象,不同对象,集合与集合复制,不再需要手动。 可以对多个对象进行复制,可以指定复制的类型
3DsMAX对象复制方法[文].pdf
深化理解JavaScript中的对象复制(Object Clone)_.docx
对象复制 将静态属性,原型属性和描述符从一个对象复制到另一个对象。安装使用安装: $ npm install --save object-copy用法var copy = require ( 'object-copy' ) ;API将静态属性,原型属性和描述符从一个对象复制...
确定将要被复制的数据是一个本地数据还是一个嵌入对象或链接。 ---- 如果数据是一个嵌入对象或链接,创建一个指向被选定数据的COleClientItem指针。 ---- 如果数据是本地化的并且应用程序是一个服务器,那么从...
js克隆使用深度复制的Javascript对象复制用法var deepClone = require ( './js-clone/index.js' ) ;var object = { name : 'Kator James' , work : { companyName : 'LogicalAddress Ltd' , getCompanyName : ...
如果程序员没有显示定义复制构造函数,编译系统就会自动生成一个默认形式的复制构造函数,其功能是创建对象时把已知的数据成员都复制到创建的新对象中。
对非DB2数据库的数据复制, 不直接支持LOB(BLOB,ClOB)等大对象数据类型,但在实际应用中,用户需要复制的表中有可能有BLOB等大对象数据,如果数据目标为Oracle,这类大对象复制的需求可通过对WII的复制进行特殊配置实现...
委托对象 将属性从一个对象复制到另一个对象,其中具有函数值的属性将在接收方的上下文中被调用,而具有非函数值的属性仅被复制。 用安装$ npm i delegate-object --save用法var delegateObject = require ( '...
对象复制的由来 为什么对象会有“复制”这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 /** * 电视机类 */ class Television { /** 屏幕高度 */ protected $_...
JavaScript中并没有直接提供对象复制(Object Clone)的方法。因此下面的代码中改变对象b的时候,也就改变了对象a。 a = {k1:1, k2:2, k3:3}; b = a; b.k2 = 4; 如果只想改变b而保持a不变,就需要对对象a进行复制。 ...
java基础规范以及java对象的复制使用