欢迎来到天天文库
浏览记录
ID:50536471
大小:285.00 KB
页数:103页
时间:2020-03-14
《Java编程思想第十四章类型信息之RTTI.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第十四章类型信息★RTTI★反射与代理一、为什么需要RTTI1、RTTI的概念★RTTI(Run-TimeTypeIdentification)◆运行时类型识别一、为什么需要RTTI2、多态的复习★从我们熟悉的一个例子开始:★这是一个典型的类层次结构图:基类位于顶部,派生类向下发展◆面向对象的基本的目:让代码只操纵对基类的引用,这样,如果要添加一个新类来扩展程序,就不会影响到原来的代码★abstractclassShape{voiddraw(){System.out.println(this+“.draw()”);}//注意:这里需要的是字符
2、串,但是提供的是对象,所以需要toString方法转换abstractpublicStringtoString();//定义为抽象,以强制继承者覆盖该方法,并可以防止对Shape的实例化}★classCircleextendsShape{publicStringtoString(){return“Circle”;}}//派生类仅仅覆盖了toString方法,下同classSquareextendsShape{...}classTriangleextendsShape{...}★publicclassShapes//测试程序{publicsta
3、ticvoidmain(String[]args){ListshapeList=Arrays.asList(newCircle(),newSquare(),newTriangle());for(Shapeshape:shapeList)//类型转换shape.draw();}}⑴当把Shape对象放入List数组时向上转型★但是在向上转型为Shape的时候,也丢失了Shape对象的具体类型◆对数组而言,它们只是Shape类的对象⑵当从数组中取出元素时,这种容器(实际上它将所有事物都当成Object引用)会自动将结果
4、转型回Shape★这是RTTI最基本的使用形式:在运行时,识别一个对象的类型◆但是RTTI类型转换却不彻底:Object被转型为Shape,而不是转型为Circle、Square或Triangle⑶接下来就是多态机制的事情了:★多态机制保证:Shape对象实际执行什么样代码,是由引用所指向的具体对象Circle、Square或者Triangle决定的,即动态绑定◆这正是面向对象编程的基本目标:你希望大部分的代码能尽可能少地了解对象的具体类型,而是只是与对象家族中的一个通用表示打交道一、为什么需要RTTI3、问题的提出★值得注意的是:动态绑定是
5、在运行时,由系统自动完成的★假如我们的要求比这个还高:◆我们不想在运行时,由系统自动进行动态绑定◆而是希望在运行的过程中,能够根据某个引用的确切类型,使用某种特别的方式来处理它,此时该怎么办?★例如:假设我们允许用户将某一具体类型的几何形状全部变成某种特殊的颜色,以突出显示它们◆或者,可能要用某个方法来旋转列出的所有图形但想跳过圆形,因为对圆形旋转没有意义◆充分使用RTTI,可以查询某个Shape引用所指向对象的确切类型,然后选择或者剔除特例二、Class对象1、Class对象的概念和作用★要理解RTTI的工作原理,首先必须知道类型信息在运行
6、时是如何表示的?◆利用Class对象来描述和表示⑴每个类都有一个Class对象,它描述了与类相关的信息★利用图形分析清楚:类和类的Class对象的关系◆因为后面还会有新的概念加进来⑵每当我们编写并且编译了一个新的类,就会生成一个与此类相关的Class对象★该Class对象是如何生成的?◆Java虚拟机利用类加载器生成★该Class对象保存在哪里?◆保存在一个同名的.class文件中二、Class对象2、类加载器⑴类加载器的组成★实际上可以包含一条类加载器链,但是只有一个原生类加载器★原生类加载器加载的是所谓的可信类,包括JavaAPI类,它们
7、通常是从本地盘加载的◆通常不需要添加额外的类加载器,但是如果你有特殊的需求(例如以某种特殊的方法加载类,以支持Web服务器应用,或者在网络中下载类),那么你有一种方式可以挂接额外的类加载器二、Class对象⑵类加载器的作用★保证Java是一种动态加载语言◆Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的★深入分析:⑴所有的类都是在对其第一次使用时,动态加载到Java虚拟机中的◆例如:当程序创建第一个对类的静态成员的引用时,就会加载这个类⑵构造器也是类的静态方法◆即使构造器之前并没有使用static关键字◆所以,使用ne
8、w操作符创建类的新对象,也会被当作对类的静态成员的引用,从而导致类的加载二、Class对象⑶类加载器的执行过程★详见P315分析:1、首先,检查这个类的Class对
此文档下载收益归作者所有