java运行期类型鉴定

java运行期类型鉴定

ID:45756715

大小:49.44 KB

页数:20页

时间:2019-11-17

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

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

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

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

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

4、Shape{publicStringtoString(){return"Circle11;}}classSquareextendsShape{publicStringtoString(){returnnSquaren;}}classTriangleextendsShape{publicStringtoString(){return^Triangle11;}}publicclassShapes{publiestaticvoidmain(String[]args){ArrayLists=newArrayList();s•add(newCircle());s•add(newSqu

5、are());s•add(newTriangle());Iteratore=s.iterator();while(e•hasNext())((Shape)e.next()).draw();}}///:〜基础类可编码成一个interface(接口)、一个abstract(抽彖)类或者一个普通类。由于Shape没有真正的成员(亦即有定义的成员),而口并不在意我们创建了一个纯粹的Shape对象,所以最适合和最灵活的表达方式便是用一个接LL而且由于不必设置所有那些abstract关键字,所以整个代码也显得更为清爽。每个衍生类都覆盖了基础类drew方法,所以具有不同的行为。在main

6、()屮创建了特定类型的Shape,然后将其添加到一个Vectoro这里止是上溯造型发生的地方,因Vector只容纳了对象。由于Java中的所有东四(除基本数据类型外)都是对象,所以Vector也能容纳Shape对象。但在上溯造型至Object的过程屮,任何特殊的信息都会丢失,其屮甚至包括对彖是儿何形状这一事实。对Vector来说,它们只是Objecto用nextElement()将一个元索从Vector提取出来的时候,情况变得稍微有些复杂。[tl于Vector只容纳Object,所以nextElement()会口然地产生一个Object句柄。但我们知道它实际是个Shape句

7、柄,而且希架将Shape消息发给那个对象。所以需要用传统的“(Shape)”方式造型成一个Shapeo这是RTTI最基本的形式,因为在Java中,所有造型都会在运行期间得到检查,以确保其正确性。那正是RTTI的意义所在:在运行期,对彖的类型会得到鉴定。在H前这种情况下,RTTI造型只实现了一部分:Object造型成Shape,而不是造型成Circle,Square或者Triangle。那是由于我们目前能够肯定的唯—事实就是Vector里充斥着几何形状,而不知它们的具体类别。在编译期间,我们肯定的依据是我们口己的规则

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

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

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