标签:als 并且 表示 tcl 方式 文本 extends 比较 根据
主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型,另一种是反射机制,它允许我们在允许时发现和使用类的信息。
要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的。
类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译路一个新类,就会产生一个Class对象。
所有的类 都是在对其第一次使用时,动态加载到JVM中。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明了构造器也是类的静态方法,即使在构造器之前并没有static关键字。因此,Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的。
类加载器首先检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件。
可以根据 class c = Class.forName(" "); //目标类的文本名 或者Class对象的newInstance()方法获取Class 引用。
2.泛化的class引用
1 Class<? extends Number> bounded = int.class; //提供类编译期的类型检查 2 bounded = double.class; 3 bounded = Number.class;
3.类型转换前先做类型检查
有instanceof 方法,只可将其与命名类型进行比较,而不能与Class对象作比较
例如 if (pet instanceof("rat")) 或者if(rat.isInstance(pet))
在查询类型信息时,以instanceof的形式(既instanceof或者isInstance()) 与直接比较Class对象有一个很重要的区别。
//如果Deriver是Base的子类 x是Derived类型 x instanceof Base //true x instanceof Derived //true Base.isInstance(x) //true Derived .isIntance(x) //true x.getClass()==Base.class //false x.getClass()==Derived.class//true x.getClass().equals(Base.class) //false x.getClass().equals(Derived.class) //true
instanceof保持类类型的概念,它指的是“你是这个类吗?或者你是这个类的子类吗?” 而如果用==比较实际的Class对象,就没有考虑继承--它是这个确切的类型,或者不是。
标签:als 并且 表示 tcl 方式 文本 extends 比较 根据
原文地址:http://www.cnblogs.com/linhaotown/p/7442167.html