http://www-900.ibm.com/developerWorks/cn/java/l-jpointer/index.shtml
IBM这个文章有点罗嗦。
java中对象赋值和基本类型赋值是不一样的,基本类型赋值就象我们通常概念一样,对象赋值实际是传递了一个引用,指向,实际是指向同一个内存,赋值者和被赋值者实际拥有同一个内存块,所以互相会影响,要实现真正的赋值,就必须clone(克隆)
谈到复制对象,一般是应用在一些极其高妙的技巧里。
我好像在一个shoppingcart程序里看到过
import java.util.Hashtable;
import java.util.Enumeration;
public class BasketBean {
/* 当前购物蓝中的商品,这里是用Hashtable来储存 */
private Hashtable products_ = new Hashtable();
/* 这是个计算购物蓝中总价的方法 */
public double getTotal() {…}
/*这是一个获得某个商品的价格的方法 */
public double getPounds(Product p_in_inv) {…}
/*调整刷新当前购物蓝中的内容,这种情况发生在客户在检查购物车中的内容时,可能有所增改。 */
public void savePurchases(HttpServletRequest request) {
//首先得到库存商品清单
Product[] products = InventoryBean.getCatalogue();
//从前台获得用户购买本商品的数量
String[] lbValues = request.getParameterValues("pounds");
if (lbValues != null) {
//清除本购物蓝中原来的内容
products_.clear();
for (int i = 0; i < lbValues.length; i++) {
double lbs = Double.parseDouble(lbValues);
if(lbs > 0) {
//从库存商品清单中 复制一份商品出来
Product p =(Product)products.clone();
//改变这个商品的数量为用户输入的数量
p.setPounds(lbs);
//将这个商品放入本购物蓝中
products_.put(Integer.toString(p.getSKU()), p);
}
}
}
}
}
clone方法有个影子克隆,要深度克隆又比较麻烦,所以除非不得已,其他创建型模式可以先考虑。
商品、乐谱、迷宫都可以用克隆的,还有什么其他的地方可以使用么?
未来有了克隆技术后,你想克隆自己任何时候都可以。
呵呵 开玩笑