正在加载图片...
Thinking in Java 3 Edition 有 Object。因此你可以从 Object数组看到一个你将在第11章遇到的 重要问题 在这个例子里,当把 Shape放进 object数组的时候,上传就发生了。 由于Java里面的所有东西(除了 primitive)都是对象,因此 Object数 组也能持有 Shape对象。但是在上传过程中,“这个对象是 Shape 的信息丢失了。对数组而言,它们都只是 object 但是,当你用下标把元素从数组里提取出来的时候,就免不了要忙活一阵 了。由于数组持有的都是些 Object,因此提取出来的也就自然都是 Object的 reference了。但是我们知道,它实际上是 Shape的 reference,而且我们也要向它发送 Shape的消息。于是老套的 “( Shape)”类型转换就变得必不可少了。这是RTTI的最基本的形 式,因为程序运行的时候会逐项检査转换是不是都正确。这种检查正体现 了RTTI的本义:在运行时鉴别对象的类型 这里的RTT转换并不彻底: object只是转换成 Shape,而不是一下 子转换成 Circle, Square或 Triangle。这是因为现阶段我们只知道 数组存储的是 Shape。编译的时候,这种转换要由你自己来把关,但是 运行的时候这种转换就不用你操心了。 接下来就交给多态性了。 Shape到底要执行哪段代码,这要由 reference究竟是指向 Circle, Square还是 Triangle对象来决定。 总之程序就该这么写;你的目标就是,要让绝大多数代码只同代表这个类 系的基类对象打交道(在本案中,就是 Shape),对它们来说,越少知道 下面的具体类型越好。这样一来,代码的读写和维护就会变得更简单,而 实现,理解和修改设计方案也会变得更容易一些。所以多态性是OOP的 个主要目标 但是如果你碰到一个特殊问题,而要解决这个问题,最简单的办法就是 “找出这个通用的 reference究竟是指哪个具体类型的”,那你又该怎 么办呢?比方说,你要让用户能用“把这类对象全都染成紫色”的办法来 突出某种 Shape。或者,你要写一个会用到“旋转”一组 shape的方 法。但是对圆形来说,旋转是没有意义的,所以你只想跳过圆形对象。有 了RTTI,你就能问出 Shape的 reference究竟是指的哪种具体类型的 对象了,这样你就能把特例给区别出来了。 Class对象 想要知道Java的RTTI是如何工作的,你就必须首先知道程序运行的时 候,类型信息是怎样表示的。这是由一种特殊的,保存类的信息的,叫作 “Cass对象( Class object)”的对象来完成的。实际上类的“常规”对 象是由 Class对象创建的 第3页共17页 www.wgqqh.com/shhgs/tij.html emailshhgsasohu.comThinking in Java 3rd Edition 第 3 页 共 17 页 www.wgqqh.com/shhgs/tij.html email:shhgs@sohu.com 有 Object。因此你可以从 Object 数组看到一个你将在第 11 章遇到的 重要问题。 在这个例子里,当把 Shape 放进 Object 数组的时候,上传就发生了。 由于 Java 里面的所有东西(除了 primitive)都是对象,因此 Object 数 组也能持有 Shape 对象。但是在上传过程中,“这个对象是 Shape” 的信息丢失了。对数组而言,它们都只是 Object。 但是,当你用下标把元素从数组里提取出来的时候,就免不了要忙活一阵 了。由于数组持有的都是些 Object,因此提取出来的也就自然都是 Object 的 reference 了。但是我们知道,它实际上是 Shape 的 reference,而且我们也要向它发送 Shape 的消息。于是老套的 “(Shape)”类型转换就变得必不可少了。这是 RTTI 的最基本的形 式,因为程序运行的时候会逐项检查转换是不是都正确。这种检查正体现 了 RTTI 的本义:在运行时鉴别对象的类型。 这里的 RTTI 转换并不彻底:Object 只是转换成 Shape,而不是一下 子转换成 Circle,Square 或 Triangle。这是因为现阶段我们只知道 数组存储的是 Shape。编译的时候,这种转换要由你自己来把关,但是 运行的时候这种转换就不用你操心了。 接下来就交给多态性了。Shape 到底要执行哪段代码,这要由 reference 究竟是指向 Circle,Square 还是 Triangle 对象来决定。 总之程序就该这么写;你的目标就是,要让绝大多数代码只同代表这个类 系的基类对象打交道(在本案中,就是 Shape),对它们来说,越少知道 下面的具体类型越好。这样一来,代码的读写和维护就会变得更简单,而 实现,理解和修改设计方案也会变得更容易一些。所以多态性是 OOP 的 一个主要目标。 但是如果你碰到一个特殊问题,而要解决这个问题,最简单的办法就是 “找出这个通用的 reference 究竟是指哪个具体类型的”,那你又该怎 么办呢?比方说,你要让用户能用“把这类对象全都染成紫色”的办法来 突出某种 Shape。或者,你要写一个会用到“旋转”一组 shape 的方 法。但是对圆形来说,旋转是没有意义的,所以你只想跳过圆形对象。有 了 RTTI,你就能问出 Shape 的 reference 究竟是指的哪种具体类型的 对象了,这样你就能把特例给区别出来了。 Class 对象 想要知道 Java 的 RTTI 是如何工作的,你就必须首先知道程序运行的时 候,类型信息是怎样表示的。这是由一种特殊的,保存类的信息的,叫作 “Class 对象 (Class object)”的对象来完成的。实际上类的“常规”对 象是由 Class 对象创建的
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有