JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制

       向上转型(upcasting):对象可以作为它本身的类型使用也可以作为它父类(基类)对象使用,java中是单继承的,所以是一种安全的做法。         

       当你初始化子类时,产生一个对象时,该对象将父类的对象作为子对象包含其中。向上转型会丢失子类的方法。但可以将所有对象至于一个共同的容器中存储与调用,实现了容器的复用,(collection 容器集默认将所有对象作为Object存储的),但在具体使用是要确定对象原来的身份。


      Java在运行中动态识别对象和类信息有两种机制:

1、RTTI(run-time type identification)运行期类别识别(强制类型转换“()”,类型转换是在运行期进行的),它假定我们在编译和运行期已经知道了所有的类型。

       Java是通过Class对象实现RTTI机制的

       Java中为每个类创建一个Class对象(*.class),它包括了与类相关的信息,用来创建类的常规对象,在运行期,一旦我们想生成某个类的对象,运行这个程序的JVM首先检查这个类的Class对象是否加载,如果尚未加载,JVM会根据类名查找.class文件,并将其载入,之后你就可以创建这个类的任何对象了。java程序不是一开始执行,所有类就被完全加载的。Class对象仅在需要时被加载,Static语句块是在类被加载时执行。


     生成Class对象的两种引用方式:

Class.forName(“Gun”)

类字面常量: Gun.class

      RTTI的限制:类在编译期间必须已知,在编译期间打开和检查.class文件。

2、反射机制(reflection)它允许我们在运行期获得类的信息。

反射机制在运行期打开和检查.class文件。

 

 

向下转型(downcasting):父类对象向下转变为具体的子类对象,但是种不安全的操作,很难确定应该转变为怎样的子类。

      为了实现复用容器,java中定义了一个通用类型:object,作为所有类的父类,以及java单根继承的特性,意味着object可以存储任何类的实例。在使用object作为容器时,你需要在其中置入对象引用(object reference),之后可以将它们取回使用,但同时原数据对象会被向上转型为Object,它会丢失自己的身份。怎样才能变回原来的对象?

      其解决方法是参数化类型(parameterized type),也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。这是JDK 5.0引入的新特性,简称为泛型。

      没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

      泛型规则和限制

  1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。

  2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

  3、泛型的类型参数可以有多个。

  4、泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。

  5、泛型的参数类型还可以是通配符类型。例如Class classType = Class.forName(java.lang.String)。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/welcomejzh/archive/2009/06/05/4244253.aspx

你可能感兴趣的:(JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制)