Java 多态中的类型转换(instanceof)

引用类型转换 
1、向上类型转换(自动/隐式类型转换),是小类型转化成大类型,不存在认了风险。即子类型对象也是父类型。 
2、向下类型转化(强制类型转化),大类型转化成小类型,存在一定风向。多态实例后,都可以向上类型转化,但是转化后,子类型对象间的互相转换就会存在一定风险。

如何规避风险? 
使用instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题

    //创建子类对象
    Dog dog = new Dog();

    // 向上类型转换(类型自动提升),不存在风险
    Animal animal = dog;

    //风险演示  animal指向Dog类型对象,没有办法转化成Cat对象,编辑阶段不会报错,但是运行会报错
    Cat cat = (Cat)animal;// 1.编译时 按Cat类型  2. 运行Dog类型  类型不匹配。直接报错

 规避风险,提高程序安全性

   //创建子类对象
    Dog dog = new Dog();

    // 向上类型转换(类型自动提升),不存在风险
    Animal animal = dog;


    // 向下类型转换(存在一定风险) 我们可以强制转换
    if(animal instanceof Dog){

        Dog  dog2 = (Dog)animal; 

        System.out.println("转化类型成功");

    }else{

        System.out.println("向下类型转化失败"+animal.getClass());
    }


    //规避风险 (instanceof运算符)
    if(animal instanceof Cat){

        Cat cat  = (Cat)animal;
        System.out.println("转化类型成功");

    }else{

        System.out.println("转化类型失败"+animal.getClass());

    }

 

总结 : 
1> instanceof 的作用是 测试它左边的对修 是否 是它右边的类的实例。 
2> 在编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使他实际所引用的对象确实包含该方法。如果需要让这个引用变量来调用它运行时类型的方法,必须使用强制类型转换把他转换成运行时类型。然而,在强制转换的过程中,是有可能出现类型强制转换异常(ClassCastException),规避他的方法也很简单,利用instanceof关键字来判断是否是本类对象,如果成立的化,再进行强制类型转换。 
instanceof 相当于oc语言中的 isMemberOfClass

 

转自:https://blog.csdn.net/qq_18505715/article/details/72631576

猜你喜欢

转载自z1414644039.iteye.com/blog/2415356