Java编程思想-类型信息(RTTI)

class对象

class对象是用来创建类的所有“常规”对象的,Java使用Class对象来执行其RTTI。

类是程序的一部分,每个类都有一个Class对象,即:每当编写并且编译一个新类,就会产生一个Class对象,该对象是由类加载器来生成的。

所有的类都是在对其第一次使用时动态加载到JVM中的,当程序创建第一个对类的静态成员的引用时就会加载这个类。这可以证明构造器也是类的静态方法,当使用new关键字创建类的新对象时也会被当做对类的静态成员的引用。

类的构造器首先会检查这个类的Class对象是否已经被加载,如果尚未加载,默认的类加载器就会根据类名来查找.class文件。一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

forName与getClass的区别

forName是用来获得对恰当的Class对象的引用(该方法属于Class类),而getClass是当你拥有了一个感兴趣的类型的对象(有确切的对象)时,可以用来获取Class引用,它属于Object的一部分,可以返回表示该对象的实际类型的Class引用。

类的字面常量

生成对Class对象的引用:使用类的字面常量(优点:简单安全)

使用类的准备工作:

1.加载:由类的加载器执行,将查找字节码,在这些字节码中创建一个Class对象

2.链接:验证类中的字节码,为静态域分配存储空间

3.初始化:如果该类具有超类,则对超类进行初始化,执行静态初始化器和静态初始化块

可以看出初始化被延迟到了对静态方法或者非常数静态域进行首次引用时才执行。

泛化的Class引用

Class引用总是执行某个Class对象,它可以制造类的实例,并包含可作用于这些实例的所有方法代码。它还包含该类的静态成员。

使用泛型通配符优于使用平凡的Class,它表示你并非是碰巧或由于疏忽,而使用了一个非具体的类引用,意思是你就是选择了一个非具体版本

类型转换前先做检查

RTTI形式包括:

  1. 传统的类型转换,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常
  2. 代表对象的类型的Class对象。通过查询Class对象可以获取运行时所需的信息
  3. 关键字instanceof,返回对象是不是某个特定类型的实例,instanceof只能与命名类型进行比较,而不能与Class对象作比较

instanceOf与Class的等价性

instanceOf保持了类型的概念,用来判断该对象是属于这个类或者是这个类的派生类?

“==”用来比较实际的Class对象,而没有考虑继承,即它是否是这个确切类型,或者不是。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值