RTTI学习及四个实现方法

原地址传送门: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
    */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值