网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.面向对象的思维方法.
.深入Struts 1.1.
.详细解析抽象类和接口的区别.
.简单介绍Java实时应用程序中的内.
.Java套接字实现网络编程之基础篇.
.JavaServer Pages常见问题.
.JAVA中用接口实现多继承和多态的.
.一个初学者初识Java内部类.
.用组件beanutils,dbutils简化JDB.
.Servlet和JavaServerPages的集成.
.针对Java移动设备的3D图形第2部分.
.Step-by-Step 使用 SWT 开发 GUI.
.JAVA入门教程:第五章.
.防止到 String 类的不恰当的类型.
.Java常见问题集锦(来自Sun中国官.
.Microsoft.NET的优势与劣势.
.J2EE与IBM对象关系数据库(1).
.如何正确利用 J2EE 的各种工具.
.Java程序的反加密.
.用Spring、Hibernate和JBoss简易.

下溯造型与运行期类型标识

发表日期:2008-1-5



  由于我们在上溯造型(在继续结构中向上移动)期间丢失了具体的类型信息,所以为了获取具体的类型信息——亦即在分级结构中向下移动——我们必须使用 “下溯造型”技术。然而,我们知道一个上溯造型肯定是安全的;基础类不可能再拥有一个比衍生类更大的接口。因此,我们通过基础类接口发送的每一条消息都肯定能够接收到。但在进行下溯造型的时候,我们(举个例子来说)并不真的知道一个几何外形实际是一个圆,它完全可能是一个三角形、方形或者其他外形。
  
下溯造型与运行期类型标识


  为解决这个问题,必须有一种办法能够保证下溯造型正确进行。只有这样,我们才不会冒然造型成一种错误的类型,然后发出一条对象不可能收到的消息。这样做是非常不安全的。
  
  在某些语言中(如C++),为了进行保证“类型安全”的下溯造型,必须采取非凡的操作。但在Java中,所有造型都会自动得到检查和核实!所以即使我们只是进行一次普通的括弧造型,进入运行期以后,仍然会毫无留情地对这个造型进行检查,保证它的确是我们希望的那种类型。假如不是,就会得到一个ClassCastException(类造型违例)。在运行期间对类型进行检查的行为叫作“运行期类型标识”(RTTI)。下面这个例子向大家演示了RTTI的行为:
  
  //: RTTI.java
  // Downcasting & Run-Time Type
  // Identification (RTTI)
  import java.util.*;
  
  class Useful {
   public void f() {}
   public void g() {}
  }
  
  class MoreUseful extends Useful {
   public void f() {}
   public void g() {}
   public void u() {}
   public void v() {}
   public void w() {}
  }
  
  public class RTTI {
   public static void main(String[] args) {
  Useful[] x = {
   new Useful(),
   new MoreUseful()
  };
  x[0].f();
  x[1].g();
  // Compile-time: method not found in Useful:
  //! x[1].u();
  ((MoreUseful)x[1]).u(); // Downcast/RTTI
  ((MoreUseful)x[0]).u(); // Exception thrown
   }
  } ///:~
  
  和在示意图中一样,MoreUseful(更有用的)对Useful(有用的)的接口进行了扩展。但由于它是继续来的,所以也能上溯造型到一个Useful。我们可看到这会在对数组x(位于main()中)进行初始化的时候发生。由于数组中的两个对象都属于Useful类,所以可将f()和g()方法同时发给它们两个。而且假如试图调用u()(它只存在于MoreUseful),就会收到一条编译期出错提示。
  
  若想访问一个MoreUseful对象的扩展接口,可试着进行下溯造型。假如它是正确的类型,这一行动就会成功。否则,就会得到一个ClassCastException。我们不必为这个违例编写任何非凡的代码,因为它指出的是一个可能在程序中任何地方发生的一个编程错误。
  
  RTTI的意义远不仅仅反映在造型处理上。例如,在试图下溯造型之前,可通过一种方法了解自己处理的是什么类型。整个第11章都在讲述Java运行期类型标识的方方面面。
上一篇:Java中的枚举器(反复器) 人气:1560
下一篇:多形性的覆盖与过载 人气:525
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐