运行时类型信息

RTTI(在运行时,识别一个对象的类型)可以在程序运行时发现和使用类型信息,这就打破了只能在编译期执行面向类型的操作的限制。使用它,可以查询某个Shape引用所指向的对象的确切类型,然后选择或者剔除特例。在面向对象编程中,一般让代码只操纵对基类的引用。在Java中,所有的类型转换都是在运行时进行正确性检查的。

Shape对象实际执行什么样的代码,是由引用所指向的具体对象(Circle、Square或者Triangle)而决定的。这符合要求:你希望大部分代码尽可能少地了解对象的具体类型,而是只与对象家族中的一个通用表示打交道(Shape基类)。这样的代码会容易写、读和维护。

Class对象

class对象负责表示在运行时的类型信息,它包含了与类有关的信息。每当编写并编译了一个新类,就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中)。Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的。当程序创建第一个对类的静态成员的引用(构造器也是类的静态方法)时,就会加载这个类到JVM中。

类加载器首先检查这个类的Class对象是否已经加载。如果未加载,默认的类加载器就会根据类名查找.class文件,而且其字节码被加载时,要接受验证,以确保其没有被破坏。一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。无论何时,只要你想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用,实现此功能的途径有:

Class.forName("全限定名")会取得一个Class对象的引用,苦类还没有被加载就加载它,找不到你要加载的类,会抛出异常ClassNotFoundException;

如果你已经拥有了一个感兴趣的类型的对象,可以通过调用getClass()方法来获取Class引用,这个方法将返回表示该对象的实际类型的Class引用。Class.getName()、getSimpleName()和getCanonicalName()分别会产生全限定的类名、类别和全限定类名。当使用Class.newInstance()创建新实例时,会得到Object引用,但这个引用指向的实际对象。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值