java第讲 类型检查.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java编程思想 Java语言 与面向对象程序设计 第八讲 第10章 10.1 10.2 10.3 10.4 10.5 10.6 第10章 类型检查 运行期类型识别(RTTI,run-time type identification)的概念初看起来非常简单:当你只有一个指向对象的基类的引用时,RTTI 机制可以让你找出这个对象确切的类型。 Java 是如何允许我们在运行期识别对象和类的信息。主要有两种方式: 一种是传统的RTTI,它假定我们在编译期和运行期已经知道了所有的类型; 另一种是“反射机制(reflection)”,它允许我们在运行期获得类的信息。 为什么需要RTTI 我们通常会创建一个特定的对象(Circle,Square,或者Triangle),把它向上转型成Shape(忽略对象的特定类型),并在后面的程序中使用匿名(译注:即不知道具体类型)的Shape引用。 简要复习一下多态和向上类型转换,并为上面的例子编码: //: c10:Shapes.java class Shape { void draw() { System.out.println(this + .draw()); } } class Circle extends Shape { public String toString() { return Circle; } } class Square extends Shape { public String toString() { return Square; } } class Triangle extends Shape { public String toString() { return Triangle; } } public class Shapes { public static void main(String[] args) { // Array of Object, not Shape: Object[] shapeList = { new Circle(), new Square(), new Triangle() }; for(int i = 0; i shapeList.length; i++) ((Shape)shapeList[i]).draw(); // Must cast } } ///:~ Shape对象实际上执行什么样的代码,是由引用指向的具体对象是Circle,Square或者Triangle而决定的。通常这正是它应该执行的行为;你希望你的大部分代码尽可能少的了解对象特定的类型,而是只与一个对象家族中通用表示打交道(在这个例子中是Shape)。这样你的代码会更容易写,更容易读,并更便于维护,你的设计也更容易实现、理解和改变。 所以“多态”是面向对象编程的基本目标。 如果我能够知道某个引用得确切类型,就可以使用最简单的方式去解决它。 例如,假设我们允许用户将某一具体类型的几何形状全都变成紫色,以突出显示它们。通过这种方法,用户就能找出屏幕上所有被突出显示的三角形。或者,你的方法可能被用来旋转列表中的所有图形,但你想跳过圆形,因为对圆形作旋转没有意义。 使用RTTI,你可以查询某个Shape引用所指向的对象的确切类型,然后选择或者剔除特例。 Class对象 “Class对象”:它包含了与类有关的信息。事实上,Class对象正是被用来创建类的“常规”对象的。 作为程序一部分,每个类都有一个Class对象。换言之,每当你编写并且编译了一个新类,就会产生一个Class对象。 在运行期,一旦我们想生成这个类的一个对象,运行这个程序的Java虚拟机首先检查这个类的Class对象是否已经加载。如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。所以Java程序并不是一开始执行,就被完全加载的,这一点与许多传统语言都不同。 一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。 一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。 类字面常量 Java 还提供了另一种方法来生成Class对象的引用:使用“类字面常量”。 类.class; //获取Class实例 类字面常量不仅可以应用于普通的类,也可以应用于接口、数组以及基本数据类型。 另外,对于基本数据类型的包装类,还有一个标准域TYPE。TYPE域是一个引用,指向对应的基本数据类型的Class对象。 类型转换前先作检查 RTTI(运行时识别一个对象)形式包括: 1. 经典的类型转换,如(Shape),由RTTI确保类型转换的正确性,如果你执行了一个错误的类型转换,就会抛出一个C

文档评论(0)

书是爱的奉献 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档