关于Java复制对象的问题

    今天写一个很简单的背包数据结构的实现,却被一个小问题难住了。在add一个新元素的方法中,开始时我是这么写的:

    可是这是一种很不安全的写法。比如客户想把一个newEntry对象添加到两个背包中,那么这两个背包中的对象实际上是同一个对象。因此在add方法中最好能复制一份newEntry, 把让entry[size]引用newEntry的备份。

    而newEntry是Object 类型,不能直接调用newEntry.clone()返回一个备份。怎么办呢?在网上搜啊搜,才知道我的疑问来自于浅复制和深复制的概念及实现。有一篇文章已经说得很好了:Java中的深复制与浅复制 http://java.chinaitlab.com/oop/716567.html  。下面总结一下该文章的内容以及我的理解。

    浅复制就是引用不同而对象相同,深复制就是对象也不同。clone() 方法十分诡异,一个类要implements Clonable, 然后覆盖clone() 方法,在clone() 方法中调用super.clone(), 才能实现深复制。如果不实现Clonable接口,则仍然是浅复制。我认为此方法很麻烦,比如我想复制一个类对象,就得把这个类的所有域的类、域的类的域的类...都搞成Clonable。更重要的是,这个方法解决不了当前的问题:我要复制一个Object。

    另一种深复制的方法是利用“序列化”。把对象写到一个Byte流中,再读出来,达到复制的效果:

 

    啊哈,其实一个Object不就是一堆字节流吗,类的结构决定了“划分”字节流的方式,从而成了某个类的对象。

    通过这次折腾,发现自己Java学得太菜了,对引用的认识太浅。要走的路还很长,继续折腾吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值