第11章运行期类型鉴定

第11章运行期类型鉴定

ID:46867587

大小:157.50 KB

页数:19页

时间:2019-11-28

第11章运行期类型鉴定_第1页
第11章运行期类型鉴定_第2页
第11章运行期类型鉴定_第3页
第11章运行期类型鉴定_第4页
第11章运行期类型鉴定_第5页
资源描述:

《第11章运行期类型鉴定》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、第口章运行期类型鉴定运行期类型鉴定(RTTI)的概念初看非常简单一手上只冇基础类型的一个句柄时,利用它判断一个对象的止确类型。然而,对RTTT的需要暴霜出了面向对象设计许多有趣(而且经常是令人闲惑的)的问题,并把程序的构造问题正式摆上了桌面。本章将讨论如何利用Java在运行期间查找对彖和类信息。这主要采取两种形式:一种是''传统-RTTI,它假定我们已在编译和运行期拥有所有类型;另一种是Javal.1特有的''反射〃机制,利用它可在运行期独立查找类信息。首先讨论''传统〃的RTTI,再讨论反射问题。11.1对RTTT的需要请考虑下面这个熟悉的类结构例子,它利用了多形性。常规类型是Shape类

2、,而特别衍生!1!来的类型是Circle,Square和Triangle。这是一个典型的类结构示意图,基础类位于顶部,衍生类向下延展。面向对象编程的基本口标是用犬量代码控制基础类型(这里是Shape)的句柄,所以假如决定添加一个新类(比如Rhomboid,从Shape衍生),从而对程序进行扩展,那么不会影响到原来的代码。在这个例了中,Shape接口屮的动态绑定方法是draw(),所以客户程序员耍做的是通过一个普通Shape句柄调用draw()odraw()在所有衍生类里都会被覆盖。而且由于它是一个动态绑定方法,所以即使通过一个普通的Shape句柄调用它,也有表现出止确的行为。这止是多形性的作

3、用。所以,我们一般创建一个特定的对象(Circle,Square,或者Triangle),把它上溯造型到一个Shape(忽略对象的特殊类型),以后便在程序的剩余部分使用匿名Shape句柄。作为对多形性和上溯造型的一个简要冋顾,可以象下面这样为上述例子编码(若执行这个程序时出现因难,请参考第3章3.1.2小节''赋值〃)://:C12:Shapes.javaimportjava.util・★;classShape{voiddraw(){System.out・printin(this+"・draw()");classCircleextendsShape{publieStringtoString(

4、){return"Circle";}}classSquareextendsShape{publicStringtoString(){returnf,Squaren;}}classTriangleextendsShape{publicStringtoString(){returnnTrianglef,;}}publicclassShapes{publiestaticvoidmain(String[]args){ArrayLists=newArrayList();s.add(newCircle());s.add(newSquare());s.add(newTriangle());Iterator

5、e=s.iterator();while(e.hasNext())((Shape)e.next())•draw();}}///:-基础类可编码成一个interface(接U)>一个abstract(抽象)类或者一个普通类。由于Shape没有真正的成员(亦即有定义的成员),而且并不在意我们创建了一个纯粹的Shape对象,所以最适合和最灵活的表达方式便是用一个接口。而且由于不必设置所有那些abstract关键字,所以整个代码也显得更为清爽。每个衍生类都覆盖了基础类draw方法,所以具有不同的行为。在main()中创建了特定类型的Shape,然后将其添加到一个Vectoro这里正是上溯造型发生的地

6、方,因为Vector只容纳了对象。由于Java中的所有东西(除基本数据类型外)都是对彖,所以Vector也能容纳Shape对彖。但在上溯造型至Object的过程中,任何特殊的信息都会丢失,其中甚至包括对象是儿何形状这一事实。对Vector来说,它们只是Objecto用nextElement()将一个元素从Vector提取出来的时候,情况变得稍微有些复杂。由于Vector只容纳Object,所以nextElement()会自然地产生一个Object句柄。但我们知道它实际是个Shape彳【J柄,而FL希望将Shape消息发给那个对象。所以需要用传统的”(Shape)”方式造型成一个Shapeo这

7、是RTT:[最基本的形式,因为在Java中,所有造型都会在运行期间得到检查,以确保其止确性。那正是RTTI的意义所在:在运行期,对象的类型会得到鉴定。在目前这种悄况下,RTTI造型只实现了一部分:Object造型成Shape,而不是造型成Circle,Square或者Triangle。那是由于我们目前能够肯定的唯一事实就是Vector里充斥着几何形状,而不知它们的具体类别。在编译期间,我们肯定的依据是我们自己

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。