Welcome 微信登录

首页 / 软件开发 / JAVA

java rtti学习总结

java rtti学习总结

java rtti学习总结2007-05-29 yycnet.yeah.net yyc译利用RTTI可根据一个匿名的基础类句柄调查出类型信息。但正是由于这个原因,新手们极易误用它,因为有些时候多形性方法便足够了。对那些以前习惯程序化编程的人来说,极易将他们的程序组织成一系列switch语句。他们可能用RTTI做到这一点,从而在代码开发和维护中损失多形性技术的重要价值。Java的要求是让我们尽可能地采用多形性,只有在极特别的情况下才使用RTTI。但为了利用多...
传递和返回对象

传递和返回对象

传递和返回对象2007-05-29 yycnet.yeah.net yyc译到目前为止,读者应对对象的“传递”有了一个较为深刻的认识,记住实际传递的只是一个句柄。在许多程序设计语言中,我们可用语言的“普通”方式到处传递对象,而且大多数时候都不会遇到问题。但有些时候却不得不采取一些非常做法,使得情况突然变得稍微复杂起来(在C++中则是变得非常复杂)。Java亦不例外,我们十分有必要准确认识在对象传递和赋值时所发...
制作本地副本

制作本地副本

制作本地副本2007-05-29 yycnet.yeah.net yyc译稍微总结一下:Java中的所有自变量或参数传递都是通过传递句柄进行的。也就是说,当我们传递“一个对象”时,实际传递的只是指向位于方法外部的那个对象的“一个句柄”。所以一旦要对那个句柄进行任何修改,便相当于修改外部对象。此外:■参数传递过程中会自动产生别名问题■不存在本地对象,只有本地句柄■句柄有自己的作用域,而对象没有■对象的&ldqu...
按值传递

按值传递

按值传递2007-05-29 yycnet.yeah.net yyc译首先要解决术语的问题,最适合“按值传递”的看起来是自变量。“按值传递”以及它的含义取决于如何理解程序的运行方式。最常见的意思是获得要传递的任何东西的一个本地副本,但这里真正的问题是如何看待自己准备传递的东西。对于“按值传递”的含义,目前存在两种存在明显区别的见解:(1) Java按值传递任何东西。若将基本数据类型传递...
java克隆对象

java克隆对象

java克隆对象2007-05-29 yycnet.yeah.net yyc译若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用clone()方法即可。Clone是“克隆”的意思,即制作完全一模一样的副本。这个方法在基础类Object中定义成“protected”(受保护)模式。但在希望克隆的任何衍生类中,必须将其覆...
使类具有克隆能力

使类具有克隆能力

使类具有克隆能力2007-05-29 yycnet.yeah.net yyc译尽管克隆方法是在所有类最基本的Object中定义的,但克隆仍然不会在每个类里自动进行。这似乎有些不可思议,因为基础类方法在衍生类里是肯定能用的。但Java确实有点儿反其道而行之;如果想在一个类里使用克隆方法,唯一的办法就是专门添加一些代码,以便保证克隆的正常进行。1. 使用protected时的技巧为避免我们创建的每个类都默认具有克隆能力,clone()方法在基础类Object里...
java Object.clone()的效果

java Object.clone()的效果

java Object.clone()的效果2007-05-29 yycnet.yeah.net yyc译调用Object.clone()时,实际发生的是什么事情呢?当我们在自己的类里覆盖clone()时,什么东西对于super.clone()来说是最关键的呢?根类中的clone()方法负责建立正确的存储容量,并通过“按位复制”将二进制位从原始对象中复制到新对象的存储空间。也就是说,它并不只是预留存储空间以及复制一个对象&mdash...
克隆合成对象

克隆合成对象

克隆合成对象2007-05-29 yycnet.yeah.net yyc译试图深层复制合成对象时会遇到一个问题。必须假定成员对象中的clone()方法也能依次对自己的句柄进行深层复制,以此类推。这使我们的操作变得复杂。为了能正常实现深层复制,必须对所有类中的代码进行控制,或者至少全面掌握深层复制中需要涉及的类,确保它们自己的深层复制能正确进行。下面这个例子总结了面对一个合成对象进行深层复制时需要做哪些事情://: DeepCopy.java// Cloni...
通过序列化进行深层复制(java)

通过序列化进行深层复制(java)

通过序列化进行深层复制(java)2007-05-29 yycnet.yeah.net yyc译若研究一下第10章介绍的那个Java 1.1对象序列化示例,可能发现若在一个对象序列化以后再撤消对它的序列化,或者说进行装配,那么实际经历的正是一个“克隆”的过程。那么为什么不用序列化进行深层复制呢?下面这个例子通过计算执行时间对比了这两种方法://: Compete.javaimport java.io.*;class Thing1 i...
使克隆具有更大的深度

使克隆具有更大的深度

使克隆具有更大的深度2007-05-29 yycnet.yeah.net yyc译若新建一个类,它的基础类会默认为Object,并默认为不具备克隆能力(就象在下一节会看到的那样)。只要不明确地添加克隆能力,这种能力便不会自动产生。但我们可以在任何层添加它,然后便可从那个层开始向下具有克隆能力。如下所示://: HorrorFlick.java// You can insert Cloneability at any// level of inheritan...
为什么有这个奇怪的设计

为什么有这个奇怪的设计

为什么有这个奇怪的设计2007-05-29 yycnet.yeah.net yyc译之所以感觉这个方案的奇特,因为它事实上的确如此。也许大家会奇怪它为什么要象这样运行,而该方案背后的真正含义是什么呢?后面讲述的是一个未获证实的故事——大概是由于围绕Java的许多买卖使其成为一种设计优良的语言——但确实要花许多口舌才能讲清楚这背后发生的所有事情。最初,Java只是作为一种用于控制硬件的语言而设计,与因特网并没有...
java克隆的控制

java克隆的控制

java克隆的控制2007-05-29 yycnet.yeah.net yyc译为消除克隆能力,大家也许认为只需将clone()方法简单地设为private(私有)即可,但这样是行不通的,因为不能采用一个基础类方法,并使其在衍生类中更“私有”。所以事情并没有这么简单。此外,我们有必要控制一个对象是否能够克隆。对于我们设计的一个类,实际有许多种方案都是可以采取的:(1) 保持中立,不为克隆做任何事情。也就是说,尽管不可对我们的类克隆,...
副本构建器

副本构建器

副本构建器2007-05-29 yycnet.yeah.net yyc译克隆看起来要求进行非常复杂的设置,似乎还该有另一种替代方案。一个办法是制作特殊的构建器,令其负责复制一个对象。在C++中,这叫作“副本构建器”。刚开始的时候,这好象是一种非常显然的解决方案(如果你是C++程序员,这个方法就更显亲切)。下面是一个实际的例子://: CopyConstructor.java// A constructor for copying a...
java只读类

java只读类

java只读类2007-05-29 yycnet.yeah.net yyc译尽管在一些特定的场合,由clone()产生的本地副本能够获得我们希望的结果,但程序员(方法的作者)不得不亲自禁止别名处理的副作用。假如想制作一个库,令其具有常规用途,但却不能担保它肯定能在正确的类中得以克隆,这时又该怎么办呢?更有可能的一种情况是,假如我们想让别名发挥积极的作用——禁止不必要的对象复制——但却不希望看到由此造成的副作用...
“一成不变”的弊端(java)

“一成不变”的弊端(java)

“一成不变”的弊端(java)2007-05-29 yycnet.yeah.net yyc译从表面看,不变类的建立似乎是一个好方案。但是,一旦真的需要那种新类型的一个修改的对象,就必须辛苦地进行新对象的创建工作,同时还有可能涉及更频繁的垃圾收集。对有些类来说,这个问题并不是很大。但对其他类来说(比如String类),这一方案的代价显得太高了。为解决这个问题,我们可以创建一个“同志”类,并使其能够修改。以后只要涉及大量的修改工作,就可...
<< 301 302 303 304 305 306 307 308 309 310 >>