《JAVA编程思想》阅读笔记 第14章 类型信息

java 中所有类型转换在运行时检查正确性,也就是在运行时识别一个对象类型。而运行时类型识别通过使用 class 对象来执行

每个类都有一个 class 对象,也就是每当编译了一个新的类JVM就会通过类加载器产生一个 class 对象(确切而言,是保存在一个同名的.class文件中)。该对象用来创建该类的所有对象。

类加载器可以包含一条类加载器链,但只有一个原生类加载器,加载所谓的“可信类”(包括从本地盘加载的 java API 类)。如果有特殊需求可以挂载额外的类加载器。

程序在创建第一个对类的静态成员引用时会加载该类(使用 new 创建的对象也会被当做对静态成员的引用),类的各个部分在需要时才被加载。类加载器首先确定类是否已经被加载,如果未被加载, 就会查找 .class 文件。在该类文件的字节码被加载时,会接受验证以确保未被破坏且不包含不良代码。

要在运行时使用类型信息,必须首先获得 Class 对象的恰当引用。Class.forName() 就是捷径(不需要相应类的对象),有对象时,则使用 getClass() 获得类的引用。Class.getInterfaces() 返回的是 Class 对象,表示对象中所包含的接口getSuperclass() 返回直接基类newInstance()(该方法创建的类必须要有默认构造器) 可以在不知道确切类型时创建对象。 

可以通过 x.class 来创建对 Class 对象的引用,这种方式称为类字面常量。可以应用于接口,数组以及基本数据类型。而且对于包装器类还有一个 TYPE 字段指向对应基本类型的 Class 对象。如

int.class

对应

Integer.TYPE

建议使用 .class 与普通类保持一致。但是这种形式并不会自动初始化,要经过三个步骤:

  1. 加载:类加载器在 classpath 指定的路径中查找字节码,并创建 Class 对象
  2. 链接:验证类的字节码,为静态域分配空间,如果需要则还会解析该类对其它类的所有引用
  3. 初始化:如果有超类,则执行静态初始化器和静态初始化块

instanceof 只能与命名类型比较,不能与 Class 对象比较。isInstance() 能够通过往方法内传入数组动态地测试对象类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值