首先,知道一种区别:
编译时可操作类型信息;
运行时识别类型信息{1-RTTI;2-反射机制};
RTTI:在运行时,识别对象的类型。
1-运行时类型识别的必要性:
多态中,向上转型,动态绑定的场景,方法和方法体在运行时才关联起来。
接口类引用=具体对象;
接口类引用.function();运行时识别具体对象类型,方法动态绑定。
从数组中取出数据时,数组将所有事物当成Object类型,会自动转型成对应类型,这是RTTI最基本的使用形式。
所有的类型转换,都是在运行时进行正确性检查。
抛出问题:怎样知道泛化引用的确切类型?
使用RTTI可以知道。
2-Class对象
类型信息在运行时如何表示?--->由Class对象来表示--包含类信息的对象。
Class对象作用:1.用来创建类的所有常规对象。
2.RTTI.
每个类都有一个Class对象,编写并且编译了一个新类,就会产生一个Class对象,保存在.class文件中。
jvm使用-类加载器-生成-Class对象。
所有类的加载,是在其第一次被使用时,动态加载到jvm.
创建第一个对类的静态成员的引用时,就会加载这个类。因此可以知道:构造器也是类的静态方法,即使没有static关键字。因此,使用构造方法也是对类的静态成员的引用。
java程序在运行前并非完全加载完毕,而是“按需加载”。
当把Class对象加载到内存,便可用它来创建类的所有对象。
Class.forName()-----获取Class对象的引用,若没被加载则加载。
必须先获取Class对象的引用,才能在运行时获取类型信息。
获取Class对象的引用3种方法:
(1) Class.forName()----不需要具体对象就可以获取Class对象的引用;
(2) 具体对象.getClass()-----也可以获取Class对象的引用;
(3) 类字面常量:ClassName.class;简单安全高效,注意:不会自动初始化该对象。 也就是说,static final 常量值 不会加载Class对象到内存。
Class对象有一些有用的方法:getName();getSimpleName();getSuperclass();