下载此文档

JAVA克隆.ppt


文档分类:IT计算机 | 页数:约14页 举报非法文档有奖
1/14
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/14 下载此文档
文档列表 文档介绍
Java 克隆主讲:李金峰传递句柄?将句柄传递进入一个方法时,指向的仍然是相同的对象。?代码: ?我们看到,无论 p还是 h引用的都是一个对象,这比复制一个 Handle 对象有效多了,使我们能把一个对象发给一个方法。别名问题?“别名”意味着多个句柄都试图指向同一个对象,就象前面的例子展示的那样。若有人向那个对象里写入一点什么东西, 就会产生别名问题。若其他句柄的所有者不希望那个对象改变, 恐怕就要失望了。?代码: ? Alias1 y = x; 它会新建一个 Alias1 句柄,但不是把它分配给由 new 创建的一个新鲜对象,而是分配给一个现有的句柄。所以句柄 x的内容——即对象 x指向的地址——被分配给 y,所以无论 x还是 y都与相同的对象连接起来。这样一来,一旦 x的i在下述语句中增值: ++; y的i值也必然受到影响。从最终的输出就可以看出: ?此时最直接的一个解决办法就是干脆不这样做:不要有意将多个句柄指向同一个作用域内的同一个对象。这样做可使代码更易理解和调试别名问题(续) ?一旦准备将句柄作为一个自变量或参数传递——这是 Java 设想的正常方法——别名问题就会自动出现,因为创建的本地句柄可能修改“外部对象”(在方法作用域之外创建的对象)。下面是一个例子: ?代码: ?方法改变了自己的参数——外部对象。一旦遇到这种情况,必须判断它是否合理,用户是否愿意这样,以及是不是会造成问题。通常, 我们调用一个方法是为了产生返回值,或者用它改变为其调用方法的那个对象的状态(方法其实就是我们向那个对象“发一条消息”的方式)。很少需要调用一个方法来处理它的参数;这叫作利用方法的“副作用”(Side Effect )。所以倘若创建一个会修改自己参数的方法,必须向用户明确地指出这一情况,并警告使用那个方法可能会有的后果以及它的潜在威胁。由于存在这些混淆和缺陷,所以应该尽量避免改变参数。按值传递?Java 按值传递任何东西。若将基本数据类型传递进入一个方法,会明确得到基本数据类型的一个副本。但若将一个句柄传递进入方法, 得到的是句柄的副本。所以人们认为“一切”都按值传递。当然,这种说法也有一个前提:句柄肯定也会被传递。但 Java 的设计方案似乎有些超前,允许我们忽略(大多数时候)自己处理的是一个句柄。也就是说,它允许我们将句柄假想成“对象”,因为在发出方法调用时, 系统会自动照管两者间的差异。?Java 主要按值传递(无自变量),但对象却是按引用传递的。得到这个结论的前提是句柄只是对象的一个“别名”,所以不考虑传递句柄的问题,而是直接指出“我准备传递对象”。由于将其传递进入一个方法时没有获得对象的一个本地副本,所以对象显然不是按值传递的。克隆对象?若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用 clone() 方法即可。 Clone 是“克隆”的意思,即制作完全一模一样的副本。这个方法在基础类 Object 中定义成“protected ”(受保护)模式。但在希望克隆的任何衍生类中,必须将其覆盖为“public ”模式。例如,标准库类 Vector 覆盖了 clone() , 所以能为 Vector 调用 clone() 。?代码: ?clone() 方法产生了一个 Object ,后者必须立即重新造型为正确类型。这个例子指出 Vector 的clone() 方法不能自动尝试克隆 Vector 内包含的每个对象——由于别名问题,老的 Vector 和克隆的 Vector 都包含了相同的对象。我们通常把这种情况叫作“简单复制”或者“浅层复制”, 因为它只复制了一个对象的“表面”部分。实际对象除包含这个“表面”以外,还包括句柄指向的所有对象,以及那些对象又指向的其他所有对象,由此类推。这便是“对象网”或“对象关系网”的由来。若能复制下所有这张网,便叫作“全面复制”或者“深层复制”。使类具有克隆能力?实现 Cloneable 接口为使一个对象的克隆能力功成圆满,还需要做另一件事情:实现 Cloneable 接口。这个接口使人稍觉奇怪,因为它是空的! interface Cloneable {} 两方面的原因促成了 Cloneable interface 的存在。首先,可能有一个上溯造型句柄指向一个基础类型,而且不知道它是否真的能克隆那个对象。在这种情况下,可用 instanceof 关键字调查句柄是否确实同一个能克隆的对象连接: if(myHandle instanceof Cloneable)

JAVA克隆 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数14
  • 收藏数0 收藏
  • 顶次数0
  • 上传人chuandao1680
  • 文件大小0 KB
  • 时间2016-05-20