原地址传送门:http://blog.csdn.net/acm_lkl/article/details/46547481
Java的RTTI
RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型.运行时类型信息可以使得你在程序运行时发现和使用类型信息.
通俗的来讲就是我们能够在程序运行时判断一个对象是属于那个类的。
下面就来总结一下常用的RTTI的方式:
(1).直接进行类型转换,由编译器保证类型转换的正确性,如果执行了一个错误的转换就抛出一个ClassCastException异常.
就像这样:((Sub)b).g();
(2).使用instanceof. instanceof是java的保留关键字之一,也是一个双目运算符,其调用形式是:a instanceof b,用于判断a是不是b的对象,如果是则返回true,否则返回false.要注意instanceof只能对有继承关系的类进行判定.这样的话我们上面开头的那段代码就可以改成下面这种更安全的形式了:
//instanceof 判断其左边对象是否为其右边类的实例
if(b instanceof Sub){
((Sub)b).g();
}
(3)直接使用Class对象进行判断.因为每个类/对象对应的Class对象都是唯一的,所以我们可以使用Class对象作为中介进行判断.但是这种判断是可能会出错的.如下面的代码所示:
import java.util.*;
class T1{
}
class T2{
}
class T3 extends T1{
}
public class Test4{
public static void main(String[] args){
T1 t1= new T1();
T2 t2= new T2();
T3 t3= new T3();
System.out.println("t1 是 T1的对象? "+(T1.class.equals(t1.getClass())));
System.out.println("t2 是 T1的对象? "+(T1.class.equals(t2.getClass())));
System.out.println("t3 是 T1的对象? "+(T1.class.equals(t3.getClass())));
System.out.println("t1 是 T3的对象? "+(T3.class.equals(t1.getClass())));
}/*Output
t1 是 T1的对象? true
t2 是 T1的对象? false
t3 是 T1的对象? false
t1 是 T3的对象? false
*/
}
(4)使用Class类提供的isInstance()方法.这种方式类似于instanceof,
但是由于可以以函数形式调用,就可以使用的更加灵活(不用将代码组织成一大堆的instanceof).
下面的代码示范了它的用法:
import java.util.*;
class T1{
}
class T2{
}
class T3 extends T1{
}
public class Test2{
public static void main(String[] args){
T1 t1= new T1();
T2 t2= new T2();
T3 t3= new T3();
///先取得该类对应的Class对象,然后以需要检测的对象作为参数传入isInstance()方法
System.out.println("t1 是 T1的对象? "+(T1.class.isInstance(t1)));
System.out.println("t2 是 T1的对象? "+(T1.class.isInstance(t2)));
System.out.println("t3 是 T1的对象? "+(T1.class.isInstance(t3)));
System.out.println("t1 是 T3的对象? "+(T3.class.isInstance(t1)));
}/*Output
t1 是 T1的对象? true
t2 是 T1的对象? false
t3 是 T1的对象? true
t1 是 T3的对象? false
*/
}