return false;
return true;
}
}
package com.prototype;
/**
* 汤匙子类
* @author Lanxiaowei
* @createTime 2011-10-10 09:20
*/
public class SoupSpoon extends Spoon {
public SoupSpoon() {
super();
}
public SoupSpoon(String name,double price){
super(name,price);
}
public SoupSpoon(String name,double price,People people){
super(name,price,people);
}
}
package com.prototype;
import java.io.Serializable;
/**
* 使用人
*
* @author Lanxiaowei
* @createTime 2011-10-10 11:19
*/
public class People implements Serializable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public People(){}
public People(String name){
this.name = name;
}
}
package com.prototype;
/**
* 测试类
*
* @author Lanxiaowei
* @createTime 2011-10-10 11:34
*/
public class Test {
public static void main(String[] args) {
/******************************************测试对象浅复制 begin************************************************/
//通过Cloneable接口浅复制一个新对象(注意Cloneable接口对于引用类型对象只能复制内存地址引用,即"浅复制")
Spoon spoon1 = new SoupSpoon("汤匙",20.5);
Spoon spoon2 = (SoupSpoon)spoon1.clone();
System.out.println("spoon1与spoon2相等吗?" + (spoon1.equals(spoon2)));
System.out.println("spoon1与spoon2是同一个对象吗?" + (spoon1 == spoon2));
System.out.println("");
//直接通过new关键字创建一个新对象
Spoon spoon3 = new SoupSpoon("汤匙",20.5);
Spoon spoon4 = new SoupSpoon("汤匙",20.5);
System.out.println("spoon3与spoon4相等吗?" + (spoon3.equals(spoon4)));
System.out.println("spoon3与spoon4是同一个对象吗?" + (spoon3 == spoon4));
/******************************************测试对象浅复制 end**************************************************/
System.out.println("");
/******************************************测试对象深复制 begin************************************************/
//通过deepClone()深复制对象
Spoon spoon5 = new SoupSpoon("汤匙",20.5,new People("zhangsan"));
Spoon spoon6 = (SoupSpoon)spoon5.deepClone();
System.out.println("spoon5与spoon6相等吗?" + (spoon5.equals(spoon6)));
System.out.println("spoon5与spoon6是同一个对象吗?" + (spoon5 == spoon6));
System.out.println("spoon5与spoon6的people是同一个对象吗?" + (spoon5.getPeople() == spoon6.getPeople()));
/******************************************测试对象深复制 end**************************************************/
}
}
其他不想多说,代码里已经表达的很清楚,唯一需要说明的是,Java对象复制分浅复制和深复制,浅复制指的是只复制非引用类型对象,深复制指的是如果类与类之间存在聚合依赖关系,那些被关联的对象也会被复制。每一个需要复制的对象都需要实现Clonable接口(它只是一个标识性接口,没有任何方法)并重写Object的clone()方法,如果一个类A关联类B,类B又关联类C.....理论上这种关系可能存在N层嵌套,如果还是每个类都这样处理,那麻烦就大了,怎么办?这时,我建议还是使用序列化的方式来实现对象深度复制比较好,首先用序列化方式实现代码才几行,非常简洁,再个就是可以用递归方式实现里,至于如何实现,下面会贴相关代码。
下面就要考虑重用性了,于是需要考虑写个工具类,来专门用于解决Java对象复制问题,下面是java对象克隆工具类的具体代码:
package com.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* 克隆工具类
* @author Lanxiaowei
* @createTime 2011-10-10 12:51
*/
pub