- 多态:基类引用实际执行什么样的代码,取决于基类引用所指向的具体对象。
- 在运行时识别对象和类的信息的方式有2种:
-
- 1.传统的RTTI ,它假定我们在编译时已经知道了所有的类型;
- 2.反射机制 ,它允许我们在运行时发现和使用类的信息
- 在Java中,所有类型转换都是在运行时进行正确性检查(识别)的。
- 类型信息的表示:由称为Class对象的特殊对象来表示
-
- 无论何时,只要你想在运行时使用类型信息,就必须首先获得该类的Class对象。
-
- 获得该类Class对象方法:
-
- 该类在第一次创建对象时或第一次调用静态方法或域时JVM自动加载,链接和初始化
- 调用Class.forName(完整类名)加载,链接并初始化指定的类
- (类字面常量)类名.class加载并链接指定类,但不会初始化该类
-
- 类是程序的一部分,每个类都有一个Class对象。换而言之,每当编写并编译一个新的类,就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class中)。
- 类加载
-
- java程序在某个类第一次使用时,动态加载到JVM,没有用到的类将不会加载。
- 加载时,类加载器首先检查这个类的Class对象是否已经加载了,如果没有加载,默认的类加载器会根据类名查找.class文件,查找字节码,并从这些字节码中创建一个Class对象。
- 一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
- Class.forName(String):加载,链接并初始化指定的类,并返回一个Class的对象
- 使用类而做的准备工作包含三个步骤:
-
- 加载。由类加载器执行。
- 链接。在链接阶段将验证类中的字节码,为静态域分配空间。如果有必需的画,将解析这个类创建的对其他类的所有引用。
- 初始化。初始化被延迟到了对静态方法或者非常数静态域首次调用的时候才执行。
- RTTI
-
- 含义:在运行时进行类型的识别
- 形式:
-
- 强制转换
- 代表对象的类型的Class对象
- 强制转换前先检查类型instanceof
- 局限性:编译器必须知道所有要通过RTTI来处理的类。
- 反射
- 反射和RTTI的区别在于
-
- 对于RTTI而言,编译器在编译时打开和检查.class(换句话说,我们可以用”普通“的方法调用对象的所有方法)
- 对于反射机制而言,.class文件在编译时期无法获取,所以在运行时打开和检查.class文件